java.sql.sql异常:ORA-00932:不一致的数据类型:预期的NUMBER得到了BINARY



我在Dao类中有一个方法,它会返回List<Object[]>,我使用的是命名的Query

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<Integer> 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<Integer> strIds传递到查询中时,它工作得很好。

我使用的是Oracle 10g。

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

我认为您只需要使用

 IN :stringId

而不是

 IN (:stringId)

对于JPA

namedQuery.setParameter("stringId", strIds);

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

namedQuery.setParameterList("stringId", strIds);

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

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

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

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

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

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

最新更新