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