문제

HQL에서 다음을 수행 할 수있는 방법이 있습니까?

SELECT 
    case when flag = true then SUM(col1) else SUM(col2)
FROM 
    myTable
도움이 되었습니까?

해결책

나는 당신이 할 수 있다고 생각합니다 (3.6, 4.3) 인라인 편집 ... 어디에서 클레이어스 :

"간단한"케이스, case ... when ... then ... else ... end, 및 "검색"케이스, case when ... then ... else ... end

다른 팁

분명히이 일을하는 능력은 분명히였습니다 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top