addScalar是什么意思?

35

Java文档说:

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

Declare a scalar query result

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

4个回答

36

该声明表明您希望查询结果返回单独命名列的对象,而不是实体。例如:

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

将返回一个单独的 Long。如果您指定多个标量,结果将作为 Object 数组返回。它类似于 executeScalar,不同之处在于它适用于命名列,并且可以返回复合结果。


19
为了避免使用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

这将返回对象数组,但现在不会使用ResultSetMetadata,而是明确从底层结果集获取ID、NAME和BIRTHDATE列,分别作为Long、String和Short。这也意味着只有这三列将被返回,即使查询使用了*并且可能返回超过三个列。
对于所有或某些标量,可以省略类型信息。
session.createSQLQuery("SELECT * FROM CATS")
.addScalar("ID", Hibernate.LONG)
.addScalar("NAME")
.addScalar("BIRTHDATE")

这基本上和之前的查询一样,但现在使用ResultSetMetaData来确定NAME和BIRTHDATE的类型,而ID的类型是明确指定的。
this复制。

4
最近的Hibernate版本好像已经不再使用这种类型字段了。请查看此答案。现在,您应该使用LongType.INSTANCE而不是Hibernate.LONG - der Michi
1
@Evan,我能否只对某些列执行addScalar(columnName, type),但查询结果应包含所有字段,因为我在select查询中指定了*?我的问题是,在我的PostgreSQL中,字段的数据类型是bigserial,在我的Java代码中转换为BigInteger。但是我的POJO类将这些字段设置为Long,因此我使用addScalar(...)指定了这些Long字段的类型,但现在我的查询仅返回这些有限的字段。我找不到出路。有什么想法吗? - mantri

4

addScalar是SQL查询中给定键的返回类型信息。

例如:

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

如果您查询结果,如果指定,则结果将是字符串或其他类型。

1

当你的bean有多个字段,类型不同,并且你想从mysql中以相同的类型获取这些字段时使用它。

例如:
public class Example { Long id; String name; }

您可以按如下方式使用add scalar。
session.createSQLQuery("SELECT * FROM tableName")
.addScalar("id", Hibernate.LONG)
.addScalar("name", Hibernate.STRING);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接