2014-05-23 11 views
5

wiosenne dane jpa 1.4.3 z Oracle 11g.Zapytanie nazwane JPA pasuje do listy krotek w klauzuli IN

Mam podmiot tak:

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

używam (wartość, LINKTYPE) jako wskaźnika zespolonego. Dla danej listy (v, t) krotek, musimy wybrać wszystkie rekordy w DB, aby wartość = v, linkType = t.

Zasadniczo, chcę zbudować to zapytanie:

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

gdzie lista w klauzula jest przekazywana jako param.

Ponieważ pracujemy z dużą ilością danych, byłoby bardzo niepożądane, aby wyszukiwać krotki jeden po drugim.

W moim repozytorium Próbowałem to:

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

gdzie klawisze znajduje się lista (listy o długości 2). W ten sposób otrzymuję ORA_00920: nieprawidłowy operator relacyjny.

Czy jest jakiś sposób, aby to działało przy użyciu nazwanego zapytania? Czy muszę uciec się do natywnego sql?

Dzięki za pomoc.

Odpowiedz

0

Odpowiedź jest za późna, ale być może ktoś inny ma ten sam problem. To jeden z moich przykładów roboczych. Tutaj muszę szukać wszystkich wpisów pasujących do danego klucza kompozytowego:

Podmiot ....

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

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

powołanie się .. ..

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

gdzie ....

articlePks to List<ArticlePk>.

Powiązane problemy