2014-05-23 87 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>