我遇到了同样的问题,我按照@Rohit Jain's answer的评论中的建议使用了 Hibernate Scalar 查询。感谢@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);
这将返回 Object 数组,但现在它不会使用 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);
当您参考Scalar queries docs 4.0时的一个困惑,addScalar
方法有第二个参数Hibernate.LONG
,请记住它自 Hibernate 版本 3.6.X 以来已被弃用
这是弃用的文档,因此您必须使用LongType.INSTANCE
相关链接