使用 TopLink 在 JPA 查询中作为命名参数列出
在以下 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 中使用列表作为命名参数? 可以强制命名参数的类型吗?
In the following JPA query, the :fcIds named parameter needs to be a list of integer values:
@NamedQuery(name = "SortTypeNWD.findByFcIds", query = "SELECT s FROM SortTypeNWD s WHERE s.sortTypeNWDPK.fcId IN (:fcIds)")
Quite logically, this is what is done when the named query is called:
Query findByDatesPlFcIds = em.createNamedQuery("SortTypeNWD.findByFcIds");
findByDatesPlFcIds.setParameter("fcIds", fcIds);
Where the variable fcIds is an ArrayList containing integers.
All the above code works fine with Hibernate but doesn't with 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).
Is there a workaround to use a List as a named parameter in TopLink? Can the type of the named parameter be forced?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
Toplink 实现了 JPA 1.0,它不支持将列表作为参数传递(collection_valued_input_parameter 是文档中使用的术语)。 这在 JPA 2.0 中得到支持,并在 TopLink 的后继者 EclipseLink 中实现。
如果您必须坚持使用 TopLink,那么您需要编写一个循环来将列表中的每个项目作为参数包含在内。
Toplink implements JPA 1.0 which doesn't support passing a list as a parameter (collection_valued_input_parameter is the term used in documentation). This is supported in JPA 2.0 which is implemented in TopLink's successor, EclipseLink.
If you have to stick with TopLink then you need to write a loop to include each item on the list as a parameter.
我遇到了类似的要求,当我将 query.setParameter("fcIds", fcIds) 更改为 setParameterList("fcIds", fcIds) 时成功。 唯一的区别是我需要在使用 Hibernate 时进行此更改(我没有使用 TopLink),而您暗示 setParamter() 似乎正在与 Hibernate 一起使用的情况。
I encountered a similar requirement, and succeeded when I changed query.setParameter("fcIds", fcIds) to setParameterList("fcIds", fcIds). The only difference was that I needed to make this change while using Hibernate (I'm not using TopLink), vs your case where you imply setParamter() seemed to be working with Hibernate.