【问题标题】:java.sql.SQLException: ORA-00932: inconsistent datatypes: expected NUMBER got BINARYjava.sql.SQLException:ORA-00932:不一致的数据类型:预期 NUMBER 得到 BINARY
【发布时间】:2014-06-06 17:45:28
【问题描述】:

我在 Dao 类中有一个方法返回 List<Object[]>,我正在使用命名查询

public List<Object[]> getListByCustomer(Session session, int customerId, List<Integer> strIds) {
  Query namedQuery = session.createSQLQuery(QueryConstants.EXPORT);
  namedQuery.setParameter("customer", customerId);
  namedQuery.setParameter("stringId", strIds);
  List<Object[]> objects = namedQuery.list();
  return objects;
}

我想将 stringId 中的List&lt;Integer&gt; strIds 传递到命名查询中,如下所示:

public class QueryConstants {
  public static final String EXPORT = 
    "SELECT sv.NAME, sv.TYPE, sv.CLIENT_ADDRESS, sv.NAME_REDUNDANT, sv.DEPARTURE_DATE, s1.CODE,sv.STATE, sv.CODE "
    + "FROM VIEW sv, PROCESS p1, SET s1 " 
    + "WHERE sv.R_ID = p1.R_ID and p1.ISSUER_ID = s1.USER_ID and sv.CUSTOMER_ID = :customer and sv.R_ID IN (:stringId)";
}

但我得到ORA-00932: inconsistent datatypes: expected NUMBER got BINARY.

此外,当我从查询中删除 sv.R_ID IN (:stringId) 时,它可以正常工作并且 当我将 Integer(strIds) 而不是 List&lt;Integer&gt; strIds 传递到查询中时,它可以正常工作。

我使用的是 Oracle 10g。

【问题讨论】:

  • 是尝试删除 (...) 即 sv.R_ID IN :stringId 仍然相同的错误。
  • 您的 JPA 供应商是什么?你也可以试试 namedQuery.setParameter("stringId", Arrays.toString(strIds.toArray()));有或没有 (...) ?
  • 您不能绑定列表以在IN 子句中使用。您需要将其转换为 Oracle 数组对象,将其视为表,然后使用连接。
  • 有人知道 SQL 查询中是否支持 IN 子句的参数绑定(相对于 JPQL 或 HQL)?很可能不会。

标签: java sql oracle named-query


【解决方案1】:

我遇到了同样的错误,但原因不同。在我的情况下,这是由于提供参数的顺序与查询中定义的顺序不同。我假设(错误地)因为参数被命名,所以顺序无关紧要。可悲的是,它似乎确实如此。

【讨论】:

    【解决方案2】:

    在我的例子中,我使用 HQL(在 spring 数据存储库中)和一个用 @Enumerated(ORDINAL)映射的实体。我试图直接在 where 子句中使用枚举对象。解决方案是使用上面成员提到的 TO_NUMBER(:your_param)。

    【讨论】:

      【解决方案3】:

      如果您的参数是列表。如果列表为空则引发错误,您必须检查该列表不为空以避免错误。 如果您的参数是单个值。让我们使用 TO_NUMBER(:your_param) 来避免错误。 它对我有用。

      【讨论】:

        【解决方案4】:

        这是一个非常具有误导性的错误,可能源于不同的原因,对我来说,我设置的参数应该是一个数字,但在运行时它设置为null,因此它是binary。在另一个情况下,由于 spring 中的 bean 创建错误而出现此错误,并且也没有正确设置参数。

        【讨论】:

          【解决方案5】:

          我遇到了同样的异常,并找到了以下原因 -

          在我的实体中,一个字段被映射到一个自定义对象(父子关系 - @ManyToOne)。后来,开发人员删除了关系注释,但数据类型没有改变。

          删除@ManyToOne 注释后,@Column 注释应该已与适当的数据类型(整数)一起使用。

          【讨论】:

            【解决方案6】:

            我想你只需要使用

             IN :stringId
            

            而不是

             IN (:stringId)
            

            对于 JPA

            namedQuery.setParameter("stringId", strIds);
            

            是正确的,但是对于 Hibernate 你应该使用

            namedQuery.setParameterList("stringId", strIds);
            

            【讨论】:

            • 需要使用namedQuery.setParameterList("stringId", strIds);谢谢
            猜你喜欢
            • 2019-05-04
            • 2017-04-21
            • 2017-11-26
            • 1970-01-01
            • 2019-08-25
            • 2017-10-29
            • 2017-12-28
            • 1970-01-01
            • 2018-10-30
            相关资源
            最近更新 更多