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

Posted

技术标签:

【中文标题】JPA 中的传递列表命名本机查询【英文标题】:Pass list in JPA named native query 【发布时间】:2021-11-18 11:40:17 【问题描述】:

我们想将字符串列表传递给名为本机查询的 JPA。我们如何实现这一点。它会抛出无效的查询参数异常。

【问题讨论】:

为什么是原生查询?处理列表需要修改 SQL 以添加每个列表元素的参数绑定,而不是 JPA 规范支持的内容。任何解决方案都将是特定于提供商的。 JPQL 查询虽然对集合参数有更广泛的支持。 我们有一个 JPQL 查询,其 ids 作为这样的列表,我们面临语法错误问题,因此尝试了原生查询。选择 r.city,case when r.name='test' then 'T' else 'N' end from testable r where r.id in (:ids) group by r.city,case when r.name='test'然后'T'否则'N'结束;。它在 group by 子句中抱怨 r.city 之后的逗号。 这可能是您应该发布的问题。该查询看起来无效 - 尝试为您的初始 case 语句起别名并在 order by 子句中使用它。 我之前发布过但没有得到任何回复,因此尝试使用本机查询。您能否更新此查询以使其正常工作(我已按照建议为 case 语句添加别名)选择 r.city ,case when r.name='test' then 'T' else 'N' end as opt from testable r where r.id in (:ids) group by r.city,case when r.name='test' then ' T' else 'N' end; 请提供足够的代码,以便其他人更好地理解或重现问题。 【参考方案1】:
@Query(value = "select e from student so where so.name in ?1", nativeQuery = true)
List<Student> someFunName(List<String> stringList);

你可以为nativeQuery尝试这样的事情,将字符串列表作为参数。

(我只是举了一个实体学生的例子)

【讨论】:

我们使用 openjpa 命名的原生查询,给定的解决方案不适用于 openjpa 你能显示你目前正在使用什么,我们可以告诉你在哪里改变它。你可以在查询和 .setParameter(1, list) 中尝试 in 而不是等于。 我们正在获取 java.util.arraylist 类型的指定参数不是有效的查询参数查询看起来像这样-从用户中选择名称,城市,其中用户 ID 在 (?);

以上是关于JPA 中的传递列表命名本机查询的主要内容,如果未能解决你的问题,请参考以下文章

如何将嵌套列表的列表传递到 JPA 本机查询中

如何在本机查询中使用 NVL 或 COALESCE 获取 Spring Data JPA 中的值列表

jpa命名本机查询无结果

JPA 原生查询

有没有办法获取带有结果集的 JPA 命名查询的计数大小?

将空列表作为参数传递给 JPA 查询会引发错误