복붙노트

[SPRING] JPQL에서 별칭을 사용하는 방법

SPRING

JPQL에서 별칭을 사용하는 방법

H2 db 테이블에서 값을 가져 오려고합니다. 내가 필요한 것을 수행하는 쿼리는 다음과 같습니다.

SELECT cast(creationDate as date) as DATE, SUM(paymentValue) as TOTAL,fxRate 
FROM payment 
group by DATE

여기서 "creationDate", "paymentValue", "fxRate"는 테이블 "지불"의 열입니다. CreationDate는 타임 스탬프이므로 날짜 만 가져와야합니다. Java로 작성하려고하면

 @Query("SELECT cast(creationDate as date) as daydate , SUM(paymentValue) as value1, fxRate as value2 FROM payment " + 
            "group by cast(creationDate as date)")
    List<Payment> findPaymentValuePerDay ();

나는 [Ljava.lang.Object; 엔티티에 캐스팅 할 수 없습니다. 지불.

나는 또한 DayDate, value1 및 value2 속성을 가진 GraphDto라는 다른 객체를 사용하려고했습니다.

@Query("SELECT cast(creationDate as date) as daydate , SUM(paymentValue) as value1, fxRate as value2 FROM payment " + 
            "group by cast(creationDate as date)")
    List<GraphDto> findPaymentValuePerDay ();

하지만 같은 오류가 발생합니다.

 [Ljava.lang.Object; cannot be cast to ...entity.GraphDto.

그렇다면 JPQL에서 별칭을 사용하여 어떻게 작업 할 수 있습니까 ?? 난 그냥 오른쪽에있는 H2 쿼리를 사용하여 기존 엔티티에서 가져온 가치와 3 개의 다른 열 이름을 반환하는 함수가 필요합니다. 다들 감사 해요

해결법

  1. ==============================

    1.귀하의 질의는 GraphDto Object가 아닌 Object []의 배열을 반환합니다.이 문제를 해결할 수있는 방법은 여러 가지가 있습니다.

    귀하의 질의는 GraphDto Object가 아닌 Object []의 배열을 반환합니다.이 문제를 해결할 수있는 방법은 여러 가지가 있습니다.

    daydate, value1, value2를 포함하는 생성자를 만듭니다.

    @Entity
    public class GraphDto{
    
        private Date daydate;
        private Long value1;
        private Long value2;
    
        public GraphDto(Date daydate, Long value1, Long value2){
            //...
        }
        //..getters and setters
    }
    

    그러면 쿼리는 다음과 같아야합니다.

    SELECT NEW com.packagename.GraphDto(cast(creationDate AS date), SUM(paymentValue), fxRate)
    FROM payment
    GROUP BY cast(creationDate AS date)
    

    반환 유형을 다음으로 변경하십시오.

    List<Object[]> findPaymentValuePerDay ();
    

    그런 다음이 객체에 대한 서비스 루프에서 값을 추출하십시오.

    List<Object[]> listObject = rep.findPaymentValuePerDay();
    for(Object[] obj : listObject){
       Date date = (Date) obj[0];
       Long value1 = (Long) obj[1];
       Long value2 = (Long) obj[2];
    }
    
  2. from https://stackoverflow.com/questions/50677700/how-to-work-with-alias-in-jpql by cc-by-sa and MIT license