addScalar做什么?

sup*_*erM 30 java sql scalar hibernate

JavaDoc说:

SQLQuery org.hibernate.SQLQuery.addScalar(String columnAlias, Type type)

Declare a scalar query result
Run Code Online (Sandbox Code Playgroud)

我知道executeScalarC#中有什么,但这个标量和C#标量似乎完全不同.

Zut*_*tty 32

这是声明您希望查询的结果返回单个命名列的对象,而不是实体.例如

createSQLQuery("SELECT COUNT(*) AS c FROM Users").addScalar("c").uniqueResult()
Run Code Online (Sandbox Code Playgroud)

将返回单一Long.如果指定多个标量,则结果将以数组形式返回Object.它类似于executeScalar它在命名列上工作,并且可以返回复合结果.


小智 16

为了避免使用ResultSetMetadata的开销,或者只是在返回的内容中更明确,可以使用addScalar():

session.createSQLQuery("SELECT * FROM CATS")
.addScalar("ID", Hibernate.LONG)
.addScalar("NAME", Hibernate.STRING)
.addScalar("BIRTHDATE", Hibernate.DATE)
Run Code Online (Sandbox Code Playgroud)

此查询指定:

the SQL query string
the columns and types to return
Run Code Online (Sandbox Code Playgroud)

这将返回Object数组,但现在它将不使用ResultSetMetadata,而是显式地将ID,NAME和BIRTHDATE列分别从底层结果集中获取Long,String和Short.这也意味着只返回这三列,即使查询使用*并且可以返回超过列出的三列.

可以省略所有或部分标量的类型信息.

session.createSQLQuery("SELECT * FROM CATS")
.addScalar("ID", Hibernate.LONG)
.addScalar("NAME")
.addScalar("BIRTHDATE")
Run Code Online (Sandbox Code Playgroud)

这与以前的查询基本相同,但现在ResultSetMetaData用于确定NAME和BIRTHDATE的类型,其中明确指定了ID的类型.

从复制.

  • @IrfanNasim:在最近的Hibernate版本中,这些类型字段似乎已被弃用.查看[此答案](http://stackoverflow.com/a/10256646/1228324).现在你应该使用`LongType.INSTANCE`而不是`Hibernate.LONG`. (4认同)