gpt4 book ai didi

java - 在 hibernate 中是否必须在 createSqlQuery() 中使用 addScalar()?为什么我们在执行SQL查询时需要指定要 hibernate 的数据类型?

转载 作者:搜寻专家 更新时间:2023-11-01 02:41:33 25 4
gpt4 key购买 nike

String sql = "select Band.band_id bandId from guest_band Band";
sessionFactory.getCurrentSession().createSQLQuery(sql)
.addScalar("bandId", Hibernate.LONG)
.list();

我知道 addScalar() 用于声明所选项目的数据类型 hibernate ,在本例中为 bandId。但是我的问题是,为什么我们需要指定 hibernate 的类型?它在内部执行什么?其次,如果我们不使用 addScalar() 是不是异常?最后,有没有其他方法可以实现这一目标?

最佳答案

这不是强制性的,但肯定有助于使用

来自 https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html

最基本的 SQL 查询是获取标量(值)列表。

sess.createSQLQuery("SELECT * FROM CATS").list();
sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").list();

这些将返回一个对象数组列表 (Object[]),其中包含 CATS 表中每一列的标量值。 Hibernate 将使用 ResultSetMetadata 来推断返回的标量值的实际顺序和类型。

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

sess.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。

This also means that only these three columns will be returned, even though the query is using * and could return more than the three listed columns.

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

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

这与以前的查询本质上是相同的,但是现在使用 ResultSetMetaData 来确定 NAME 和 BIRTHDATE 的类型,其中明确指定了 ID 的类型。

从 ResultSetMetaData 返回的 java.sql.Types 如何映射到 Hibernate 类型由 Dialect 控制。如果未映射特定类型,或未产生预期类型,则可以通过调用 Dialect 中的 registerHibernateType 对其进行自定义。

关于java - 在 hibernate 中是否必须在 createSqlQuery() 中使用 addScalar()?为什么我们在执行SQL查询时需要指定要 hibernate 的数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31996679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com