1

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()、または別の集計関数を使用すると、同じ動作が得られます。

4

2 に答える 2

2

結局jOOQに切り替えました。これまでのところ、経験は非常にポジティブです。API は多少似ていますが、ドキュメントはより良く、無効な SQL を生成しません。

于 2013-07-26T13:19:01.173 に答える
1

ここにはいくつかの問題があります。

  • HibernateSQLQueryHibernate API を介して SQL クエリを実行するためのものを使用します。Hibernate ORM クエリに使用しHibernateQueryてください。

  • ORM クエリ用に生成された Q タイプを SQL クエリで使用します。Querydsl はこの使用法をより適切に処理する必要があり、そのためのチケットを作成しましたhttps://github.com/mysema/querydsl/issues/463

Querydsl は、Hibernate の ORM ベースと SQL ベースのクエリの両方をサポートしていますが、誤ってそれらを混在させました。

通常の Hibernate クエリの場合、例は次のようになります

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

QSessions は Sessions エンティティに基づいていると思います。

jOOQ は SQL レベルの非常に優れた代替手段ですが、JPA および NoSQL ベースのストレージにもアクセスする必要がある場合は、Querydsl がさらに多くの機能を提供します。

于 2013-07-27T19:31:37.057 に答える