我遇到了同样的问题,我使用了Hibernate Scalar查询,正如
@Rohit Jain答案的评论中建议的那样。感谢
@nambari的评论。
谈到我们面临的问题,
Query query = session
.createSQLQuery("SELECT COUNT(*) FROM controllnews WHERE news_id="
+ id + ";");
这些代码将返回一个对象数组(Object []),其中包含
controllnews
表中每个列的标量值。Hibernate将使用ResultSetMetadata来推断返回的标量值的实际顺序和类型。
为了避免使用ResultSetMetadata的开销,或者更加明确地指定返回内容,可以使用
addScalar()方法:
Query query = session
.createSQLQuery("SELECT COUNT(*) as count FROM controllnews WHERE news_id="
+ id + ";").addScalar("count", LongType.INSTANCE);
这将返回对象数组,但现在它不会使用ResultSetMetadata,而是从底层的结果集中显式获取
count
列作为
Long
。从ResultSetMetaData返回的
java.sql.Types
如何映射到Hibernate类型由方言控制。如果未映射特定类型或未产生预期类型,则可以通过在Dialect中调用
registerHibernateType
来自定义它。
您可以使用
Query#setParameter方法避免查询中的任何错误。
Query query = session
.createSQLQuery("SELECT COUNT(*) as count FROM controllnews WHERE news_id= :id")
.addScalar("count", LongType.INSTANCE).setParameter("id",id);
当您参考标量查询文档4.0时,addScalar
方法的第二个参数是Hibernate.LONG
,请记住自Hibernate版本3.6.X以来已被弃用
这里是废弃的文档,因此您必须使用LongType.INSTANCE
相关链接