programing

JPQL에 그런 CASE 표현이 있나요?

powerit 2023. 3. 14. 21:57
반응형

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

반응형