2014-05-23 91 views
5

spring数据jpa 1.4.3与Oracle 11g。JPA命名查询匹配IN子句中的元组列表

我有一个实体是这样的:

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

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

基本上,我想建立这样的查询:

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

在IN子句在列表中传过来的PARAM。

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

在我的仓库我已经试过这样:

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

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

有什么办法使用命名查询来完成这项工作吗?或者我必须诉诸本地SQL?

感谢您的帮助。

回答

0

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

实体....

@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<ArticlePk>