addScalar 是做啥的?

Posted

技术标签:

【中文标题】addScalar 是做啥的?【英文标题】:What does addScalar do?addScalar 是做什么的? 【发布时间】:2013-03-01 11:05:20 【问题描述】:

JavaDoc 说:

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

Declare a scalar query result

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

为了避免使用 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 的类型。

复制自this。

【讨论】:

@IrfanNasim:这些类型字段在最近的 Hibernate 版本中似乎已被弃用。查看this answer。现在你应该使用LongType.INSTANCE 而不是Hibernate.LONG @Evan 有没有办法让我只能对某些列执行 addScalar(columnName, type) 但查询结果应该包含所有字段,因为我在选择查询中指定了 * ?所以我的问题是,在我的 PostgreSQL 中,该字段的数据类型是 bigserial,在我的 Java 代码中转换为 BigInteger。但是我的 POJO 类的这些字段为 Long,所以我使用 addScalar(...) 指定了这些 Long 字段的类型,但现在我的查询只返回那些有限的字段。我无法找到出路。有什么想法吗?【参考方案3】:

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

例子:

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

如果查询结果,结果会是String或其他类型,如果你指定。

【讨论】:

【参考方案4】:

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

public class Example  Long id; String name; 

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

session.createSQLQuery("SELECT * FROM tableName")
.addScalar("id", Hibernate.LONG)
.addScalar("name", Hibernate.STRING);

【讨论】:

以上是关于addScalar 是做啥的?的主要内容,如果未能解决你的问题,请参考以下文章

sizeof 是做啥的?

FragmentManager 和 FragmentTransaction 到底是做啥的?

这段代码是做啥的? [关闭]

CSS:这个星号 (*) 是做啥的?

真正的“统计”是做啥的?

框架布局是做啥的?