잡동사니

반응형

질문

이 코드의 문제점은 무엇입니까?

@Query(value = "Select " +
    "date(ivd.trnDatetime) as date, " +
    "ivd.binNo as bin, " +
    "ivd.snNo as sn, " +
    "count(ivd.invoiceNo) as totInvoice, " +
    "sum(ivd.totSaleAmt) as totSaleAmt " +
    "from InvoiceData ivd where ivd.status = 1 group by date(ivd.trnDatetime), ivd.binNo, ivd.snNo")
List<Object[]> getDailyTransactionReport();

던진다

    java.lang.IllegalArgumentException: org.hibernate.QueryException: No data type for node: org.hibernate.hql.internal.ast.tree.MethodNode 
 +-[METHOD_CALL] MethodNode: '('
 |  +-[METHOD_NAME] IdentNode: 'date' {originalText=date}
 |  \-[EXPR_LIST] SqlNode: 'exprList'
 |     \-[DOT] DotNode: 'invoicedat0_.transaction_at' {propertyName=trnDatetime,dereferenceType=PRIMITIVE,getPropertyPath=trnDatetime,path=ivd.trnDatetime,tableAlias=invoicedat0_,className=com.efdms.transactionmonitoring.domain.InvoiceData,classAlias=ivd}
 |        +-[ALIAS_REF] IdentNode: 'invoicedat0_.id' {alias=ivd, className=com.efdms.transactionmonitoring.domain.InvoiceData, tableAlias=invoicedat0_}
 |        \-[IDENT] IdentNode: 'trnDatetime' {originalText=trnDatetime}
 [Select date(ivd.trnDatetime) as date, ivd.binNo as bin, ivd.snNo as sn, count(ivd.invoiceNo) as totInvoice, sum(ivd.totSaleAmt) as totSaleAmt from com.efdms.transactionmonitoring.domain.InvoiceData ivd where ivd.status = 1 group by date(ivd.trnDatetime), ivd.binNo, ivd.snNo]
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:138)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188)
    at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:729)
    at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:23)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:351)
    at com.sun.proxy.$Proxy190.createQuery(Unknown Source)
    at org.springframework.data.jpa.repository.query.SimpleJpaQuery.validateQuery(SimpleJpaQuery.java:87)
    ... 62 common frames omitted

엔티티의 trnDatetime속성

@NotNull
@Column(name = "transaction_at", nullable = false)
private Instant trnDatetime;

SqlServer의 해당 열은 datetime 입니다.


답변1

오류 메시지는 transaction_at 에 대한 값이 없음을 알려줍니다. 이는 테이블의 일부 레코드에 transaction_at 에 대한 null값이 있거나 어떤 이유로 쿼리에 의해 선택되지 않았 음을 의미합니다. 이를 선택 해야하며 null인 경우 기본값을 갖거나 가있는 레코드를 필터링합니다. 해당 특정 필드의 값으로 null .

또한 transaction_at 의 값이 반드시 필요하지 않은 경우 @Column 에서 nullable = false 를 제거 할 수 있습니다.

편집하다

주석 섹션에서 지적한 해결책은 CAST (ivd.trnDatetime AS date) 입니다.



답변2

JPQL은 date () 를 지원하지 않으므로 쿼리가 실패합니다. 다음 옵션이 있습니다.

  1. @Query 에서 nativeQuery = true 를 설정하여 네이티브 SQL을 사용하도록 변경합니다.
  2. Hibernate를 사용하는 경우 HQL 특정 를 사용하세요. trnDatetime LocalDate 로 캐스팅하는 cast () :
select cast(ivd.trnDatetime as LocalDate) as date ,
       count(ivd.invoiceNo) as totInvoice 
       from InvoiceData ivd 
       where ivd.status = 1 
       group by cast(ivd.trnDatetime as LocalDate)"

간결성을 위해 다른 열은 무시합니다.

결과 목록의 각 항목에있는 인덱스 0은 LocalDate 입니다.



 

 

 

 

출처 : https://stackoverflow.com/questions/59124239/how-to-convert-datetime-to-date-in-jpql

반응형

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band