34

JavaDoc 说:

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

Declare a scalar query result

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

4

4 回答 4

36

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

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

将返回单个Long. 如果您指定多个标量,结果将返回为Object. 它类似于,executeScalar除了它适用于命名列,并且可以返回复合结果。

于 2013-03-13T13:40:44.403 回答
18

为了避免使用 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 和 BIRTHDATE 的类型,其中明确指定了 ID 的类型。

从此复制。

于 2014-03-22T03:31:15.763 回答
4

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

例子:

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

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

于 2013-03-13T15:14:11.040 回答
1

当您的 bean 具有多个具有不同类型的字段并且您希望从 mysql 获取相同类型的这些字段时使用此选项。例如。

public class Example { Long id; String name; }

您可以按如下方式使用添加标量

session.createSQLQuery("SELECT * FROM tableName")
.addScalar("id", Hibernate.LONG)
.addScalar("name", Hibernate.STRING);
于 2019-03-12T07:20:42.957 回答