2014-05-23 22 views
5

jpa dữ liệu mùa xuân 1.4.3 với Oracle 11g.JPA được đặt tên truy vấn khớp với danh sách các bộ dữ liệu trong mệnh đề IN

Tôi có một thực thể như thế này:

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

Tôi đang sử dụng (giá trị, linkType) như là một chỉ số tổng hợp. Đối với một danh sách (v, t) tuples, chúng ta cần phải chọn tất cả các bản ghi trong DB để giá trị = v, linkType = t.

Về cơ bản, tôi muốn xây dựng truy vấn này:

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

nơi danh sách trong mệnh đề IN được thông qua tại như một param.

Vì chúng tôi đang làm việc với một lượng lớn dữ liệu nên sẽ rất khó để truy vấn từng bộ một.

Trong kho của tôi, tôi đã cố gắng này:

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

nơi phím là danh sách (danh sách có độ dài 2). Điều này giúp tôi ORA_00920: toán tử quan hệ không hợp lệ.

Có cách nào để thực hiện công việc này bằng truy vấn được đặt tên không? Hoặc tôi có phải nghỉ dưỡng để sql bản địa?

Cảm ơn sự giúp đỡ của bạn.

Trả lời

0

Câu trả lời là quá muộn, nhưng có thể some1 khác có cùng vấn đề. Đây là một trong những ví dụ làm việc của tôi. Ở đây tôi cần phải tìm kiếm cho tất cả các mục phù hợp với một chìa khóa hợp đưa ra:

Thực thể ....

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

Lớp 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 
} 

Invocation bởi .. ..

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

nơi ....

articlePksList<ArticlePk>.

Các vấn đề liên quan