2012-10-08 7 views
5

शामिल हैं, मुझे एक मुश्किल हाइबरनेट क्वेरी समस्या के साथ सहायता चाहिए। मैं निम्नलिखित संस्थाओं है:हाइबरनेट: उन इकाइयों का चयन करें जहां संग्रह में सभी निर्दिष्ट वैलस

public class Book { 
    private String bookId; 
    private String author; 
    private String isbn; 
    private Set<Tag> tags; 
    // getters, setters etc. 
} 

और

public class Tag { 
    private String tagId; 
    private String tagName; 
    // getters, setters, etc. 
} 

दो कि एक में शामिल होने तालिका books_tags_mn का प्रतिनिधित्व करती है कॉलम के साथ book_id और tag_id जो कई-से-अनेक संघ नहीं है।

मुझे क्या करना पसंद है: मैं एक हाइबरनेट क्वेरी/मानदंड क्वेरी बनाना चाहता हूं जो सभी टैग्स के एक निश्चित सेट के सभी पुस्तकें लौटाता है। टैग्स के सेट के की सभी पुस्तकों का चयन करने का काम क्या है।

मैं मानदंड एपीआई के साथ गड़बड़ कर रहा हूं लेकिन वास्तव में इसे समझ में नहीं आया। तो क्या मैं (छद्म HQL में) करने के लिए

from Book book where book.tags containsAll(:tags) 

किसी भी मदद के लिए इस पर अत्यधिक सराहना की होगी कोशिश कर, तो पहले से बहुत बहुत धन्यवाद कर रहा हूँ।

उत्तर

3

आप निम्न क्वेरी का उपयोग कर सकते हैं:

select book from Book book 
where :numberOfTags = (select count(tag.id) from Book book2 
         inner join book2.tags tag 
         where book2.id = book.id 
         and tag in (:tags)) 

जहां numberOfTags टैग का सेट है कि मेल खाना आवश्यक में टैग की संख्या है।

+0

धन्यवाद है कि एक आकर्षण की तरह काम करता जोड़ने की जरूरत है अगर तुम तो संग्रह में डुप्लिकेट का समर्थन करने की जरूरत है! –

+0

यदि संग्रह में डुप्लिकेट हो सकते हैं (आईडी पर नहीं) तो आप गिनती (विशिष्ट) जोड़ना चाहेंगे – Ben

0

मैं तुम्हें दो कस्टम कार्यों या प्रतिबंध के रूप में बनाने के लिए सलाह होगा:

collect(book.tags) -> returns list of tags associated with the book 

containsAll(bookTagsList, tags) --> validates and returns true if all 
            tags elements are present in bookTagsList 
            returned by the first function "collect" 

एक बार कार्यों में परिभाषित किया और पंजीकृत हैं, तो आप HQL/मापदंड क्वेरी चलाने के लिए सक्षम हो जाएगा की तरह:

from Book book where containsAll(collect(book.tags), :tags) 

या

session.createCriteria(Book.class).add(
      Restrictions.add(collect("tags").containsAll(tags)) 
     ).list(); 

कृपया ध्यान दें: यह विचार साझा करने के लिए सिर्फ नमूना छद्म कोड है।

आशा है कि इससे मदद मिलती है!

0

जेबी निजेट का स्वीकार्य उत्तर अच्छा है लेकिन यदि आपके संग्रह में डुप्लिकेट हो सकता है (शायद इसके लिए एक वैध कारण हो सकता है, शायद टैग उदाहरण के साथ नहीं) तो यह काम नहीं करेगा।

आइए कहें कि कुछ पुस्तकों के संग्रह में "MyTag" नाम के साथ डुप्लिकेट टैग हो सकते हैं। फिर टैग "माईटैग" की खोज, "योरटैग" उन पुस्तकों को वापस कर सकती है जिनमें 2 "माईटैग" टैग हैं लेकिन कोई "आपकाटैग" टैग नहीं है।

select b from Book b where :numberOfTags = (select count(distinct tag.tagName) from Book b2 inner join b2.tags tag where b2.id = b.id and tag.tagName IN (:tagNames)) 

जैसा कि मैंने स्वीकार कर लिया जवाब के साथ कुछ भी गलत नहीं कहा, लेकिन आप गणना (अलग tag.name)

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