【问题标题】:JPA named query match a list of tuples in IN clauseJPA 命名查询匹配 IN 子句中的元组列表
【发布时间】:2014-07-13 00:13:38
【问题描述】:

带有 Oracle 11g 的 spring data jpa 1.4.3。

我有一个这样的实体:

class LinkRecord {
  String value;
  int linkType;
  ...
}

我使用 (value, linkType) 作为复合索引。 对于给定的 (v, t) 元组列表,我们需要选择 DB 中的所有记录,使得 value = v, linkType = t。

基本上,我想构建这个查询:

SELECT * FROM LINK_RECORD WHERE (VALUE, LINK_TYPE) IN (('value1', 0), ('value2', 25), ...)

IN 子句中的列表作为参数传入。

由于我们正在处理大量数据,因此非常不希望逐个查询元组。

在我的存储库中,我尝试过这个:

@Query("select r from LinkRecord r where (r.value, r.linkType) in :keys")
List<LinkRecord> findByValueAndType(@Param("keys")List<List<Object>> keys);

其中 keys 是(长度为 2 的列表)的列表。这让我得到 ORA_00920:无效的关系运算符。

有没有办法使用命名查询来完成这项工作?还是我必须求助于原生 sql?

【问题讨论】:

    标签: sql hibernate jpa spring-data-jpa named-query


    【解决方案1】:

    答案为时已晚,但也许其他人也有同样的问题。这是我的工作示例之一。在这里,我需要搜索与给定复合键匹配的所有条目:

    实体....

    @Entity
    @NamedQueries({
        @NamedQuery(name = "Article.findByIdAndAccessId", query = "SELECT a FROM Article a WHERE a.articlePk IN (:articlePks) ORDER BY a.articlePk.article")
    })
    @Table(name = "ARTICLE")
    public class Article implements Serializable
    {
        private static final long serialVersionUID = 1L;
    
        @EmbeddedId
        private ArticlePk articlePk = new ArticlePk();
    
        @Column(name = "art_amount")
        private Float amount;
    
        @Column(name = "art_unit")
        private String unit;
    
        public Article()
        {
        }
    
        //more code
    }
    

    PK类....

    @Embeddable
    public class ArticlePk implements Serializable
    {
        private static final long serialVersionUID = 1L;
    
        @Column(name = "art_article")
        private String article;
    
        @Column(name = "art_acc_identifier")
        private Long identifier;
    
        public ArticlePk()
        {
        }
    
        public ArticlePk(String article, Long identifier)
        {
            this.article = article;
            this.identifier = identifier;
        }
    
        @Override
        public boolean equals(Object other)
        {
            if (this == other)
            {
                return true;
            }
            if (!(other instanceof ArticlePk))
            {
                return false;
            }
    
            ArticlePk castOther = (ArticlePk)other;
            return this.article.equals(castOther.article) && this.identifier.equals(castOther.identifier);
        }
    
        @Override
        public int hashCode()
        {
            final int prime = 31;
            int hash = 17;
            hash = hash * prime + this.article.hashCode();
            hash = hash * prime + this.identifier.hashCode();
    
            return hash;
        }
    
        //more code
    }
    

    由....调用

    TypedQuery<Article> queryArticle = entityManager.createNamedQuery("Article.findByIdAndAccessId", Article.class);
    queryArticle.setParameter("articlePks", articlePks);
    List<Article> articles = queryArticle.getResultList();
    

    在哪里……

    articlePksList&lt;ArticlePk&gt;

    【讨论】:

      猜你喜欢
      • 2011-09-10
      • 2014-09-17
      • 1970-01-01
      • 2011-05-21
      • 2017-07-20
      • 2014-02-24
      • 2015-06-14
      相关资源
      最近更新 更多