的JavaDoc的说:addScalar做什么?
SQLQuery org.hibernate.SQLQuery.addScalar(String columnAlias, Type type)
Declare a scalar query result
我知道什么executeScalar
是在C#中,但这种标和C#标似乎是完全不同的。
的JavaDoc的说:addScalar做什么?
SQLQuery org.hibernate.SQLQuery.addScalar(String columnAlias, Type type)
Declare a scalar query result
我知道什么executeScalar
是在C#中,但这种标和C#标似乎是完全不同的。
这是声明您希望查询的结果为单个命名列而不是实体返回对象。例如
createSQLQuery("SELECT COUNT(*) AS c FROM Users").addScalar("c").uniqueResult()
将返回单个Long
。如果您指定了多个标量,结果将返回为Object
的数组。它类似于executeScalar
,只是它在指定列上工作,并且可以返回复合结果。
addScalar
是SQL查询中给定键的returnType的信息。
例子:
Query a = new SqlQuery("Select username as un from users where ...");
a.addScalar("un", String);
如果查询结果,结果将是字符串或其它类型,如果你指定。
为了避免使用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。
@IrfanNasim:这些类型的字段在最近的Hibernate版本中似乎不推荐使用。看看[这个答案](http://stackoverflow.com/a/10256646/1228324)。现在你应该使用'LongType.INSTANCE'而不是'Hibernate.LONG'。 – Michi 2015-09-02 09:48:37
@Evan有没有一种方法,我只能做一些列的addScalar(columnName,type),但查询结果应该有所有的字段,因为我在select查询中指定了'*'?所以我的问题是,在我的PostgreSQL中,字段的数据类型是'bigserial',并且在我的Java代码中转换为'BigInteger'。但是我的POJO类有Long这些字段,所以我使用'addScalar(...)'指定了那些'Long'字段的类型,但现在我的查询只返回那些有限的字段。我无法找到出路。任何想法 ? – mantri 2017-03-21 10:52:39