ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
# 16.1.1\. 标量查询(Scalar queries) 最基本的SQL查询就是获得一个标量(数值)的列表。 ``` sess.createSQLQuery("SELECT * FROM CATS").list(); sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").list(); ``` 它们都将返回一个Object数组(Object[])组成的List,数组每个元素都是CATS表的一个字段值。Hibernate会使用ResultSetMetadata来判定返回的标量值的实际顺序和类型。 如果要避免过多的使用`ResultSetMetadata`,或者只是为了更加明确的指名返回值,可以使用`addScalar()`。 ``` sess.createSQLQuery("SELECT * FROM CATS") .addScalar("ID", Hibernate.LONG) .addScalar("NAME", Hibernate.STRING) .addScalar("BIRTHDATE", Hibernate.DATE) ``` 这个查询指定了: * SQL查询字符串 * 要返回的字段和类型 它仍然会返回Object数组,但是此时不再使用`ResultSetMetdata`,而是明确的将ID,NAME和BIRTHDATE按照Long,String和Short类型从resultset中取出。同时,也指明了就算query是使用`*`来查询的,可能获得超过列出的这三个字段,也仅仅会返回这三个字段。 对全部或者部分的标量值不设置类型信息也是可以的。 ``` sess.createSQLQuery("SELECT * FROM CATS") .addScalar("ID", Hibernate.LONG) .addScalar("NAME") .addScalar("BIRTHDATE") ``` 基本上这和前面一个查询相同,只是此时使用`ResultSetMetaData`来决定NAME和BIRTHDATE的类型,而ID的类型是明确指出的。 关于从ResultSetMetaData返回的java.sql.Types是如何映射到Hibernate类型,是由方言(Dialect)控制的。假若某个指定的类型没有被映射,或者不是你所预期的类型,你可以通过Dialet的`registerHibernateType`调用自行定义。