我正在使用 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() 或其他聚合函数时,我得到相同的行为。