【发布时间】:2023-04-09 08:05:01
【问题描述】:
我正在将我们所有的 sql 查询转换为使用 Hibernate 参数。现在,当我在查询中添加参数并将其映射到变量时,它总是给我错误:
ERROR o.h.e.jdbc.spi.SqlExceptionHelper - 转换数据类型时出错 nvarchar 到 bigint。
这没有任何意义,因为我添加了一个字符串参数。
查询看起来像:
Query query = session.createSQLQuery("SELECT Sum([qtyrequired]) as pcs, o.materialrequireddate, itemid "
+ "FROM [materialManagement].[pcsorderrequirement] r JOIN materialmanagement.pcsorders o "
+ "ON o.id = r.pcsorderid WHERE itemid IN ( :items ) "
+ "AND Cast(o.materialrequireddate AS DATE) >= Cast(Getdate() AS DATE) "
+ "AND o.materialrequireddate <= Cast( :endDate AS DATE) "
+ "GROUP BY o.materialrequireddate, itemid")
.setString("items", items).setString("endDate", endDate.format(DateTimeFormatter.ISO_LOCAL_DATE));
当我返回到原来的工作查询时,它看起来像:
Query query = session.createSQLQuery("SELECT Sum([qtyrequired]) as pcs, o.materialrequireddate, itemid "
+ "FROM [materialManagement].[pcsorderrequirement] r " + "JOIN materialmanagement.pcsorders o "
+ "ON o.id = r.pcsorderid " + "WHERE itemid IN (" + items + ") "
+ "AND Cast(o.materialrequireddate AS DATE) >= Cast(Getdate() AS DATE) "
+ "AND o.materialrequireddate <= Cast('" + endDate + "' AS DATE) "
+ "GROUP BY o.materialrequireddate, itemid");
当我使用命名参数时,什么会产生这个异常?我正在使用 Hibernate 5.1 和数据库 MS SQL 服务器。
【问题讨论】:
-
异常的原因是您正在为 itemId 值列表传递单个字符串参数。 SQL Server 要求
IN子句中的每个值都有单独的整数参数。我不知道如何使用 Hibernate 来做到这一点。 -
这是一个例子,但是当我包含一个不会放在 IN 中的普通字符串值时,我也会在每个映射中得到它。
-
对于标量参数值,指定正确的数据类型设置器,如
setDate。另请注意,将函数应用于查询谓词中的列将阻止索引的有效使用。考虑将Cast(o.materialrequireddate AS DATE) >= Cast(Getdate() AS DATE)重构为o.materialrequireddate AS DATE >= Cast(Getdate() AS DATE)。
标签: java sql-server hibernate