使用 TopLink 在 JPA 查询中作为命名参数列出

Posted

技术标签:

【中文标题】使用 TopLink 在 JPA 查询中作为命名参数列出【英文标题】:List as a named parameter in JPA query using TopLink 【发布时间】:2009-07-23 07:46:37 【问题描述】:

在以下 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 中使用 List 作为命名参数的解决方法?命名参数的类型可以强制吗?

【问题讨论】:

【参考方案1】:

Toplink 实现了不支持将列表作为参数传递的 JPA 1.0(collection_valued_input_parameter 是文档中使用的术语)。这在 JPA 2.0 中得到支持,该 JPA 2.0 在 TopLink 的继任者 EclipseLink 中实现。

如果您必须坚持使用 TopLink,那么您需要编写一个循环以将列表中的每个项目作为参数包含在内。

【讨论】:

将其包含在命名查询中而不是 NativeNamedQueries 中的好主意是谁?我搜索了两个小时,试图弄清楚为什么我的查询不起作用。【参考方案2】:

我也遇到过类似的需求,将query.setParameter("fcIds", fcIds)改成setParameterList("fcIds", fcIds)就成功了。唯一的区别是我需要在使用 Hibernate 时进行此更改(我没有使用 TopLink),而您暗示 setParamter() 似乎正在使用 Hibernate 的情况。

【讨论】:

以上是关于使用 TopLink 在 JPA 查询中作为命名参数列出的主要内容,如果未能解决你的问题,请参考以下文章

如何在 jpa 中为 EmbeddedId 编写选择命名查询?

JPA 中的传递列表命名本机查询

无法在本机查询中使用“:”作为分隔符

如何在 JPA 命名查询的 IN 子句中使用动态参数?

在批量更新命名查询的情况下,JPA 中不会更新版本

JPA:命名查询数据库独立性