在本机 sql 查询中使用 IN 子句

Posted

技术标签:

【中文标题】在本机 sql 查询中使用 IN 子句【英文标题】:Using IN clause in a native sql query 【发布时间】:2010-10-24 08:05:57 【问题描述】:

我们正在尝试为本地 sql 查询动态生成 IN 子句以返回 JPA 实体。 Hibernate 是我们的 JPA 提供者。我们的代码看起来像这样。

@NamedQuery(
    name="fooQuery",
    queryString="select f from Foo f where f.status in (?1)"
)

....

Query q = entityManager.createNamedQuery("fooQuery");
q.setParameter(1, "('NEW','OLD')");
return q.getResultList();

这不起作用,in 子句无法识别通过这种方式传入的任何值。有谁知道这个问题的解决方案吗?

【问题讨论】:

【参考方案1】:

我建议不要对查询使用复合参数,而是将其单独拆分。不要指定('NEW','OLD');指定'NEW''OLD' 的单独参数。这可能会有所帮助。

当然,如果您的参数长度未定义,这可能会导致问题。

【讨论】:

【参考方案2】:

在您的情况下,JPA 支持命名列表参数:

@NamedQuery(
    name="fooQuery",
    queryString="select f from Foo f where f.status in (?1)"
)

Query q = entityManager.createNamedQuery("fooQuery");

List<String> listParameter = new ArrayList<>();
listParameter.add("NEW");
listParameter.add("OLD");

q.setParameter(1, listParameter); 
return q.getResultList();

【讨论】:

这不是原生查询,所以我猜这不是一个可以接受的答案? JPA 将生成带有从 Java 列表参数化的 IN 子句的 SQL 查询 - 生成的 SQL 查询将包含本机 (SQL) IN 子句。

以上是关于在本机 sql 查询中使用 IN 子句的主要内容,如果未能解决你的问题,请参考以下文章

JPA将列表传递给命名本机查询中的IN子句

如何通过 Spring Boot JPA 执行具有 INTERVAL 子句的本机 SQL 查询?

SQL IN 逗号分隔参数与内部查询

使用带有休眠 SQL 查询的多列的参数化 IN 子句

优化广泛使用 IN 子句的 Oracle SQL 查询

如何在使用变量的动态查询中指定 IN 子句?