2014-06-11 6 views
2

querydsl에 SQLExpression.datediff()에 의해 반환 NumberExpression 사용 방법 테이블에 자기-가입과 같이 SQLExpression.datediff를 사용하여 :내가 뭐하는 거지

:

QSomeTable tb1 = new QSomeTable("tb1"); 
QSomeTable tb2 = new QSomeTable("tb2"); 
NumberExpression<Integer> ne = SQLExpression.datediff(DatePart.hour, tb1.time,  tb2.time); 


query.from(tb1, tb2).where........list(ne); 

이 다음과 같은 예외를 제공합니다 org.springframework.dao.InvalidDataAccessApiUsageException : 노드에 대한 데이터 유형이 없습니다 : org.hibernate.hql.internal.ast.tree.MethodNode

목록 절에서 다른 필드를 선택하려고 시도했지만 문제없이 작동합니다.

도움에 감사드립니다.

답변

1

JPQL에서 지원하지 않기 때문에 SQLExpressions는 Querydsl JPA 쿼리에서 지원되지 않습니다. 또한이 표현식의 직렬화가 SQL dialect에만 한정되어 있기 때문에 에뮬레이트하기도 어렵습니다.

+0

나는 쿼리 작성을 계산하기 위해 QueryDSL SQL을 사용자에게 보내려고한다. 3.3.2 버전을 사용해 보았지만이 버전에서는 SQLQUeryImpl 클래스가 누락되었습니다. 그런 다음 이전 2.9.0 버전을 사용해 보았습니다. 이 하나는 SQLQueryImpl 있지만 SQLExpressions 클래스에서 datediff 메서드가 없습니다. 당신은 올바른 querydsl SQL 버전을 가르쳐 주시겠습니까? – AVM

+0

SQLQueryImpl이 SQLQuery로 변경되었습니다. –

1

그래서이 문제에 대한 내 해결 방법은보기를 만든 다음보기를 매핑하는 데 스프링 엔티티를 사용하는 것이 었습니다. Querydsl은이 엔티티 상단에서 원활하게 작동합니다. 로

는 아이디, TIMESTAMPDIFF (SECOND, t.time1, t.time2)와 같은 선택 t.id로보기 my_view를 만들 : DB에

보기 : 내 경우

,이 같은 짓을 my_table에서 timediff t;

봄 엔티티

@Entity(name="my_view") 
public class MyTableBean{ 

@Id 
@Column(name="id") 
Long id; 

@Column(name="timediff") 
Long timediff; 

//Getters and setters 

} 

는 이제 모든 쿼리는 일반 테이블

QMyTableBean qt = new QMyTableBean(); 
// Initilize entity manager and JPQL query 

Long res = query.from(qt).where.....list(qt.timediff); 

이 코드 방언 독립 만드는 장점이있다처럼이보기를 기준으로 할 수 있습니다. 뷰는 모든 주요 SQL 스토어에서 지원되며 향후 마이 그 레이션이 발생하면 애플리케이션에 미치는 영향은 미미합니다.