2014-05-23 6 views
5

वसंत डेटा जेपीए 1.4.3 ओरेकल 11 जी के साथ टुपल्स की एक सूची से मेल खाता है।जेपीए नामित क्वेरी आईआर क्लॉज

मैं इस तरह एक इकाई है:

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

मैं (मूल्य, LinkType) का उपयोग कर रहा एक समग्र सूचकांक के रूप में। (v, t) tuples की किसी दिए गए सूची के लिए, हमें डीबी में सभी रिकॉर्ड्स चुनने की आवश्यकता है ताकि मूल्य = v, linkType = t।

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

जहां में खंड में सूची का कोई पैरामीटर के रूप में में पारित हो जाता है:

मूल रूप से, मैं इस क्वेरी का निर्माण करना चाहते।

चूंकि हम बड़ी मात्रा में डेटा के साथ काम कर रहे हैं, इसलिए यह एक-एक करके टुपल्स के लिए पूछताछ करने के लिए बहुत अवांछनीय होगा।

@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 प्राप्त करता है: अमान्य संबंध ऑपरेटर।

क्या इस नाम को नामांकित क्वेरी का उपयोग करने का कोई तरीका है? या मुझे देशी एसक्यूएल का सहारा लेना है?

आपकी मदद के लिए धन्यवाद।

उत्तर

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 
} 

पी वर्ग ....

@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> है।

संबंधित मुद्दे