【问题标题】:Using IN clause in a native sql query在本机 sql 查询中使用 IN 子句
【发布时间】: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 子句无法识别通过这种方式传入的任何值。有谁知道这个问题的解决方案吗?

【问题讨论】:

    标签: sql hibernate jpa in-operator sql-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 子句。
      猜你喜欢
      • 2011-07-29
      • 2017-05-24
      • 2014-01-02
      • 2016-04-25
      • 1970-01-01
      • 2011-10-21
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多