2013-07-24 3 views
1

QueryDSL과 최대 절전 모드를 사용하여 SqlServer2008 데이터베이스를 쿼리하고 있습니다.Querydsl이 기본 집계 쿼리에서 잘못된 SQL을 생성합니다.

sessionId 열이 포함 된 세션 테이블이 있습니다. max sessionId를 얻고 싶습니다.

내가 다음 쿼리를 실행합니다

QSessions session = QSessions.sessions; 
HibernateSQLQuery query = new HibernateSQLQuery(sessionFactory.openSession(), new SQLServer2005Templates()); 
query.from(session).list(session.sessionId.max()); 

내있는 hibernate.cfg.xml :

<hibernate-configuration> 
    <session-factory> 
     <property name="hibernate.connection.url">jdbc:sqlserver://SVR;databaseName=DB</property> 
     <property name="hibernate.connection.username">X</property> 
     <property name="hibernate.connection.password">X</property> 
     <property name="hibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property> 
     <property name="hibernate.dialect">org.hibernate.dialect.SQLServer2008Dialect</property> 

     <mapping class="com.coveo.data.Sessions" /> 
    </session-factory> 
</hibernate-configuration> 

내가 쿼리를 실행하면, 내가 Hibernate는 다음 SQL 쿼리를 실행하려고 시도 것을 볼 수있다 :

17:36:10.011 [main] DEBUG org.hibernate.SQL - select max(sessions.*.sessionId) as col__1 from sessions 

이것은 유효한 SQL이 아닙니다. 나는

을 기대했을 것이다
select max(sessions.sessionId) as col__1 from sessions 

Hibernate는 쿼리를 실행하려고 할 때, 나는 다음과 같은 오류 얻을 :

com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near '*'. 

내가 SQL Management Studio를 사용하여 유효하지 않은 SQL 쿼리를 실행하려고 같은 구문 오류를 .

왜 Querydsl에는 방언이 필요합니까? Hibernate가 SQL 생성을 담당하고 있지 않습니까?

왜 생성 된 SQL이 유효하지 않습니까?

편집 : .avg(), .min() 또는 다른 집계 함수를 사용할 때 동일한 동작이 발생합니다.

+1

[querydsl support/forums] (https://groups.google.com/forum/#!포럼/querydsl) 등? 여기 얼마나 많은 사람들이 querydsl에 익숙한 지 모르겠습니다. 왜 이런 방식으로 작동하는지 당신에게 말할 수는 없을 것입니다. –

+1

@AaronBertrand : 최소한 21 세 이상이어야합니다. –

+2

@AndriyM 내 생각을 분명히하지 않은 것 같습니다. 나는 숫자가 0이 될 것이라고 기대하지 않았지만 얼마나 많은 사람들이 지금 온라인 상태인지, 태그를보고 있는가? 지원 포럼부터 시작하겠습니다. –

답변

1

여기에 몇 가지 문제가 있습니다. 최대 절전 모드 ORM에 대한 HibernateQuery을 사용하시기 바랍니다 당신은 하이버 네이트 API를 통해 SQL 쿼리를 실행하기위한 것입니다 HibernateSQLQuery를 사용

Querydsl 최대 절전 모드 모두 ORM 및 SQL 기반의 쿼리를 지원하고 실수를 혼합하기위한 티켓을 만들었습니다. 정상적인 최대 절전 모드에 대한

은 예를 들어 내가 QSessions이 세션 개체를 기반으로 가정

QSessions session = QSessions.sessions; 
HibernateQuery query = new HibernateQuery(sessionFactory.openSession()); 
query.from(session).list(session.sessionId.max()); 

것 쿼리합니다.

jOOQ는 SQL 수준에서 매우 좋은 대안이지만 JPA 및 NoSQL 기반 저장소에 액세스해야하는 경우 Querydsl은 더 많은 것을 제공합니다.

2

jOOQ으로 전환되었습니다. 지금까지 경험은 매우 긍정적이었습니다. API는 다소 유사하며 문서가 더 좋으며 유효하지 않은 SQL을 생성하지 않습니다.