QueryDSL と Hibernate を使用して SqlServer2008 データベースにクエリを実行しています。
sessionId 列を含む Sessions テーブルがあります。最大の 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()、または別の集計関数を使用すると、同じ動作が得られます。