2014-05-23 12 views
5

spring data jpa 1.4.3 con Oracle 11g.La query con nome JPA corrisponde a una lista di tuple nella clausola IN

devo un'entità simili:

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

sto usando (valore, LINKTYPE) come indice composito. Per un determinato elenco di tuple (v, t), è necessario selezionare tutti i record nel DB in modo che value = v, linkType = t.

Fondamentalmente, voglio costruire questa query:

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

in cui la lista nella clausola IN viene passato come parametro.

Poiché stiamo lavorando con un grande volume di dati, sarebbe molto indesiderabile interrogare le tuple una alla volta.

Nel mio repository Ho provato questo:

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

in cui le chiavi è una lista di liste di lunghezza (2). Questo mi fa ORA_00920: operatore relazionale non valido.

C'è un modo per rendere questo lavoro utilizzando una query denominata? O devo ricorrere a sql nativo?

Grazie per il vostro aiuto.

risposta

0

La risposta è troppo tardi, ma forse qualcun altro ha lo stesso problema. Questo è uno dei miei esempi di lavoro. Qui ho bisogno di cercare per tutte le voci che corrispondono a una determinata chiave composita:

L'entità ....

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

La classe 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 di .. ..

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

dove ....

articlePks è List<ArticlePk>.

Problemi correlati