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

标签 java sql hibernate hql

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/

相关文章:

java - 创建具有大量属性的对象的更好方法

java - 为方法运行 junit 测试时出现 org.hsqldb.jdbcDriver ClassNotFoundException

sql - R: Knitr 给出了 SQL-chunk 的错误

java - 在 Play 中使用 Map 作为模型的属性

java - 如何使 Wicket 7 与 Java 8 中的 java.time 一起工作?

SQL 选择创建日期记录的位置

sql - 如何进行大量插入

java - hibernate 注释 : map a list that keeps order

java - 我的子表没有删除

java - 将文件写入内部存储时崩溃