在下面的JPA查询中,:fcIds命名参数需要是一个整数值列表:
@NamedQuery(name = "SortTypeNWD.findByFcIds", query = "SELECT s FROM SortTypeNWD s WHERE s.sortTypeNWDPK.fcId IN (:fcIds)")从逻辑上讲,这是在调用命名查询时执行的操作:
Query findByDatesPlFcIds = em.createNamedQuery("SortTypeNWD.findByFcIds");
findByDatesPlFcIds.setParameter("fcIds", fcIds);其中,变量fcIds是包含整数的ArrayList。
上面的代码在Hibernate上运行良好,但在TopLink上就不行了:
Caused by: java.lang.IllegalArgumentException: You have attempted to set a value of type class java.util.ArrayList for parameter fcIds with expected type of int from query string SELECT s FROM SortTypeNWD s WHERE s.sortTypeNWDPK.fcId IN (:fcIds).在TopLink中,是否有将列表用作命名参数的解决方法?可以强制指定命名参数的类型吗?
发布于 2009-10-13 17:05:48
Toplink实现了JPA1.0,它不支持将列表作为参数传递(collection_valued_input_parameter是文档中使用的术语)。这在TopLink的后续版本EclipseLink中实现的JPA2.0中得到了支持。
如果您必须坚持使用TopLink,那么您需要编写一个循环来将列表中的每一项都作为参数包含在内。
发布于 2009-10-09 14:50:37
唯一的区别是,我需要在使用Hibernate时进行此更改(我没有使用TopLink),而您所暗示的setParamter()似乎可以使用Hibernate。
https://stackoverflow.com/questions/1170266
复制相似问题