MSSQL问题Hibernate标准

时间:2018-05-08 11:44:13

标签: sql-server hibernate hibernate-criteria

我正在使用Java-Hibernate和两个数据库(Postgresql和MSSQL)。 带有方言的SqlServer2012:

hibernate.dialect = org.hibernate.dialect.SQLServer2012Dialect

我写了一个Criteria查询,如:

DetachedCriteria detachedCriteria=DetachedCriteria.forClass(entityClazz);
ProjectionList proj = Projections.projectionList();
proj.add(Projections.max(COMPOSEDID_VERSION_ID));
proj.add(Projections.groupProperty(COMPOSEDID_ID));
detachedCriteria.setProjection(proj);

criteria = session.createCriteria(entityClazz)
            .add( Subqueries.propertiesIn(new String[] { COMPOSEDID_VERSION_ID, COMPOSEDID_ID }, detachedCriteria));

这个查询在Postgre Db上运行良好。但是当我切换到MSSQL时,我收到以下错误:

Caused by: java.sql.SQLException: An expression of non-boolean type specified in a context where a condition is expected, near ','.
    at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:372)
    at net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2988)
    at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2421)
    at net.sourceforge.jtds.jdbc.TdsCore.getMoreResults(TdsCore.java:671)
    at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQLQuery(JtdsStatement.java:505)
    at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeQuery(JtdsPreparedStatement.java:1029)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:70)[201:org.hibernate.core:5.0.0.Final] 

任何人都可以帮助我吗?我应该在Criteria API中做出哪些改变,以实现我的目标,即针对每个Id?

获取maxVersion记录

1 个答案:

答案 0 :(得分:1)

不要在分离的克里特里亚群岛的投影标准中添加子查询,而是像这样直接在克里特里亚群岛中添加投影:

DetachedCriteria detachedCriteria=DetachedCriteria.forClass(entityClazz);
ProjectionList proj = Projections.projectionList();
proj.add(Projections.max(COMPOSEDID_VERSION_ID));
proj.add(Projections.groupProperty(COMPOSEDID_ID));


criteria = session.createCriteria(entityClazz)
.setProjection( proj );