虽然不是必须的,但使用以下内容会有所帮助:
来自https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html
最基本的SQL查询是获取标量(值)列表。
sess.createSQLQuery("SELECT * FROM CATS").list();
sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").list();
这些代码将返回一个包含CATS表中每一列标量值的对象数组(Object[])列表。Hibernate将使用ResultSetMetadata来推断返回的标量值的实际顺序和类型。
为了避免使用ResultSetMetadata所带来的开销,或者更明确地指定返回的内容,可以使用addScalar()方法:
sess.createSQLQuery("SELECT * FROM CATS")
.addScalar("ID", Hibernate.LONG)
.addScalar("NAME", Hibernate.STRING)
.addScalar("BIRTHDATE", Hibernate.DATE)
这个查询指定了以下内容:
SQL查询字符串
要返回的列和类型
这将返回对象数组,但现在它不会使用ResultSetMetadata,而是明确从底层结果集中获取ID、NAME和BIRTHDATE列,分别作为Long、String和Short。
这也意味着只有这三列将被返回,即使查询使用*并且可能返回超过这三列的其他列。
可以省略所有或部分标量的类型信息。
sess.createSQLQuery("SELECT * FROM CATS")
.addScalar("ID", Hibernate.LONG)
.addScalar("NAME")
.addScalar("BIRTHDATE")
这本质上与之前的查询相同,但现在使用ResultSetMetaData来确定NAME和BIRTHDATE的类型,而ID的类型是明确指定的。
从ResultSetMetaData返回的java.sql.Types如何映射到Hibernate类型由Dialect控制。如果没有映射特定类型,或者没有产生预期的类型,则可以通过在Dialect中调用registerHibernateType来自定义它。