【问题标题】:Hibernate throws converting data type exceptionHibernate 抛出转换数据类型异常
【发布时间】: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) &gt;= Cast(Getdate() AS DATE) 重构为o.materialrequireddate AS DATE &gt;= Cast(Getdate() AS DATE)

标签: java sql-server hibernate


【解决方案1】:

我将查询更改为不转换为日期并使用正确的类型设置参数:

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 <= :endDate "
                + "GROUP  BY o.materialrequireddate, itemid").setParameterList("items", items.stream().map(Item::getId).collect(Collectors.toList()))
                .setDate("endDate", Date.from(endDate.atStartOfDay(ZoneId.systemDefault()).toInstant()));

【讨论】:

    猜你喜欢
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多