반응형
JPQL에 그런 CASE 표현이 있나요?
테이블이 있다고 칩시다.
TableA:Field1, Field2, Field3
및 연관된 JPA 엔티티 클래스
@Entity
@Table(name="TableA")
public class TableA{
@Id
@Column(name="Field1")
private Long id;
@Column(name="Field2")
private Long field2;
@Column(name="Field3")
private Long field3;
//... more associated getter and setter...
}
이 SQL로 약하게 번역된 JPQL 문을 작성하는 방법, 즉 대소문자를 JPQL로 변환하는 방법이 있습니까?
select field1,
case
when field2 = 1 then 'One'
when field2 = 2 then 'Two'
else 'Other number'
end,
field3
from tableA;
JPA 2.0에 추가되었습니다.
사용방법:
SELECT e.name, CASE WHEN (e.salary >= 100000) THEN 1 WHEN (e.salary < 100000) THEN 2 ELSE 0 END FROM Employee e
참조: http://en.wikibooks.org/wiki/Java_Persistence/JPQL_BNF#New_in_JPA_2.0
Hibernate 에는 확실히 이러한 기능이 있기 때문에, Hibernate 를 JPA 프로바이더로서 사용하는 경우는, 다음의 예와 같이 쿼리를 쓸 수 있습니다.
Query query = entityManager.createQuery("UPDATE MNPOperationPrintDocuments o SET o.fileDownloadCount = CASE WHEN o.fileDownloadCount IS NULL THEN 1 ELSE (o.fileDownloadCount + 1) END " +
" WHERE o IN (:operations)");
query.setParameter("operations", mnpOperationPrintDocumentsList);
int result = query.executeUpdate();
DB의 한 행을 로드할 때 Jpa에서 제공하는 이벤트 수신기를 사용하여 다음과 같은 작업을 수행할 수 있습니다.
@Entity
@Table(name = "TableA")
public class TableA {
@Id
@Column(name = "Field1")
private Long id;
@Column(name = "Field2")
private Long field2;
@Column(name = "Field3")
private Long field3;
// ... more associated getter and setter...
@Transient
private String field4;
@PostLoad
private void onLoad() {
if (field2 != null) {
switch (field2.intValue()) {
case 1:
field4 = "One";
break;
case 2:
field4 = "Two";
break;
default:
field4 = "Other Number";
break;
}
}
}
}
(field4는 db에 유지되지 않음)
(이것을 케이스 스테이트먼트와 같은 「JPA에 실장되어 있지 않은 기능」의 회피책으로 합니다).
언급URL : https://stackoverflow.com/questions/427447/is-there-such-thing-case-expression-in-jpql
반응형
'programing' 카테고리의 다른 글
입력내부에서 입력누름시 리액션방지폼제출 (0) | 2023.03.14 |
---|---|
wordpress에서 파일의 로컬 경로를 가져오는 방법 (0) | 2023.03.14 |
장고: "TypeError: []은(는) JSON을 시리얼화할 수 없습니다." (0) | 2023.03.14 |
'react-hooks/exhaustive-deps' 규칙에 대한 정의를 찾을 수 없습니다. (0) | 2023.03.14 |
AngularJS에서 사용자가 템플릿/페이지를 떠날 때 어떻게 감지합니까? (0) | 2023.03.14 |