2013-03-13 81 views
23

的JavaDoc的说:addScalar做什么?

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

Declare a scalar query result 

我知道什么executeScalar是在C#中,但这种标和C#标似乎是完全不同的。

回答

26

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

createSQLQuery("SELECT COUNT(*) AS c FROM Users").addScalar("c").uniqueResult() 

将返回单个Long。如果您指定了多个标量,结果将返回为Object的数组。它类似于executeScalar,只是它在指定列上工作,并且可以返回复合结果。

3

addScalar是SQL查询中给定键的returnType的信息。

例子:

Query a = new SqlQuery("Select username as un from users where ..."); 
a.addScalar("un", String); 

如果查询结果,结果将是字符串或其它类型,如果你指定。

13

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

session.createSQLQuery("SELECT * FROM CATS") 
.addScalar("ID", Hibernate.LONG) 
.addScalar("NAME", Hibernate.STRING) 
.addScalar("BIRTHDATE", Hibernate.DATE) 

这个查询指定:

the SQL query string 
the columns and types to return 

这将返回Object数组,但现在它不会使用ResultSetMetadata,而是显式地将ID,NAME和BIRTHDATE列分别作为基础结果集的Long,String和Short。这也意味着只有这三列将被返回,即使查询使用*并且可能返回多于列出的三列。

可以忽略所有或部分标量的类型信息。

session.createSQLQuery("SELECT * FROM CATS") 
.addScalar("ID", Hibernate.LONG) 
.addScalar("NAME") 
.addScalar("BIRTHDATE") 

这在本质上是相同的查询和以前一样,但是现在使用ResultSetMetaData来确定NAME和出生日期,而ID的类型是明确指出的类型。

抄自this

+3

@IrfanNasim:这些类型的字段在最近的Hibernate版本中似乎不推荐使用。看看[这个答案](http://stackoverflow.com/a/10256646/1228324)。现在你应该使用'LongType.INSTANCE'而不是'Hibernate.LONG'。 – Michi 2015-09-02 09:48:37

+0

@Evan有没有一种方法,我只能做一些列的addScalar(columnName,type),但查询结果应该有所有的字段,因为我在select查询中指定了'*'?所以我的问题是,在我的PostgreSQL中,字段的数据类型是'bigserial',并且在我的Java代码中转换为'BigInteger'。但是我的POJO类有Long这些字段,所以我使用'addScalar(...)'指定了那些'Long'字段的类型,但现在我的查询只返回那些有限的字段。我无法找到出路。任何想法 ? – mantri 2017-03-21 10:52:39