HQL Select에서 사례 명령문 사용
-
19-08-2019 - |
문제
HQL에서 다음을 수행 할 수있는 방법이 있습니까?
SELECT
case when flag = true then SUM(col1) else SUM(col2)
FROM
myTable
다른 팁
분명히이 일을하는 능력은 분명히였습니다 3.0.4에 추가되었습니다, else 절에서 하위 선택을 사용할 수 없다는 제한 사항이 있습니다.
최대 절전 모드를 참조하십시오. https://forum.hibernate.org/viewtopic.php?t=942197
팀의 답변 (Gavin) : 사례는 WHER 절에서 뒷받침되지만 HB3의 선택 조항에는 없습니다.
그리고 Jira에서 "해결되지 않은"상태와 함께 보았습니다.
아래에서는 부울 값을 해당 텍스트 표현으로 바꾸기 위해 2 개의 사례 문을 사용하는 작업 쿼리 (PostgreSQL의 최대 절전 모드)를 찾을 수 있습니다.
사례 ps. onepen을 선택하면 'Open'Else '닫힌 닫기'종료, case ps.full true 'full'else 'free'end, ps.availablecapacity의 ps as ps로 ps.availablecapacity
우리는 최대 절전 모드 HQL 쿼리를 광범위하게 사용하며 마침내 그런 일을하는 해킹 방법이 있다고 생각합니다.
우리가 원래 쿼리가 있다고 가정합니다
i2.element.id = :someId
그런 다음 이것을 다음과 같이 확장하기로 결정했습니다.
((i.element.id = :someId and i2.element.id=:someId) or (i2.element.id = :someId))
그러나 Classtype를 기반으로 이것을 찾아야 할 문제가 있었으므로 CASE 문의 사항이있었습니다.
(case when type(i)=Item then
((i.element.id = :someId and i2.element.id=:someId) or (i2.element.id = :someId))
else
i.element.id = :someId
end)
위의 작동하지 않습니다. 위의 작업의 쉬운 버전을 만들 수 있습니다.
(case when type(i)=Item then
i2.element.id
else
i.element.id
end)=:elementId
그러나 이것은 실제로 우리가해야 할 일을하는 것이 아니며, 우리는 그것이 쿼리보다 정확한 일을하기를 원하므로, 당신이 HQL의 비트가있는 곳에서 사례 문의 끝에서 변수를 할당 할 수 있다는 것을 알고 있습니다.
(
(
(case when
type(r)=Item then
i.element.id
else
i.element.id end) = :elementId
and
(case when
type(r)=Item then
i2.element.id
else
i.element.id end) = :elementId
)
or
(case when
type(r)=Item then
i2.element.id
else
i.element.id end) = :elementId
)
나는 Case 문을 기반으로 쿼리를 작동 시켰으며, 그것이 훨씬 길어 지지만 실제로 첫 번째 인스턴스와 동일합니다.
HQL에서 같은 문제에 직면 한 다음 다음 쿼리를 해결했습니다.
select CONCAT(event.address1,', ', CASE WHEN event.address2 IS NULL THEN '' ELSE concat(event.address2,', ') END, event.city from EventDetail event where event.startDate>=:startDate and event.endDate<=:endDate;
이것은 조건에서 문자열 비교를 사용하는 예입니다.
SELECT CASE f.type WHEN 'REMOVE'
THEN f.previousLocation
ELSE f.currentLocation
END
FROM FileOperation f