2010-05-27 19 views
8

के साथ तारों के संग्रह के अंदर सभी वस्तुओं को प्राप्त करना मैं संग्रह के अंदर एक विशिष्ट तत्व रखने वाली इकाइयों को खोजने के लिए एक हाइबरनेट मानदंड क्वेरी बनाने की कोशिश कर रहा हूं।मानदंड एपीआई

हम एक उदाहरण है कि -object एक पुस्तक के रूप में इस तरह दिखता है ले जा सकते हैं:

public class Book { 
    private Long id; 
    private String title; 
    private Set<String> authors = new HashSet<String>(); 
} 

इकाई इस तरह मैप किया गया है:

<class name="Book" table="Book"> 
    <id name="id" column="BOOK_ID"> 
     <generator class="native"/> 
    </id> 
    <property name="title"/> 
    <set name="authors" table="Book_Authors"> 
     <key column="BOOK_ID"/> 
     <element type="string" column="AUTHORS"/> 
    </set> 
</class> 

अब मैं पता लगाने के लिए जो किताबें हैं चाहते हैं मैट द्वारा लिखित शुद्ध एसक्यूएल के साथ मैं इस तरह एक प्रश्न कर सकते हैं:

String author = "Matt"; 
String query = "SELECT * FROM Book " + 
       "WHERE BOOK_ID IN " + 
       "(SELECT BOOK_ID FROM Book_Authors " + 
       "WHERE authors = :author)"; 
List<Book> result = session.createSQLQuery(query) 
     .addEntity(Book.class) 
     .setParameter("author", author) 
     .list(); 

यह अच्छी तरह से सभी अच्छी और काम करता है, और मैं सभी पुस्तकों कि मैट लेखन का एक हिस्सा रहा है बाहर निकलना। हालांकि, मैं जिस परियोजना में काम करता हूं, कच्चे एसक्यूएल के बजाय मानदंड एपीआई का उपयोग करता है, और मुझे उस फ़ॉर्म में एक ही क्वेरी को व्यक्त करने का कोई तरीका नहीं मिला है। मैंने प्रतिबंध API पर एक नज़र डाली है और मुझे सबसे नज़दीकी पाया गया है Restions.in (propertyName, संग्रह) लेकिन यह दूसरी तरफ काम करता है (ऑब्जेक्ट में एक मान, इसके विरुद्ध मिलान करने के लिए कई मान)।

कोई विचार?

+0

यदि लेखक एक इकाई थी, तो आप एक subquery – sblundy

उत्तर

2

सबसे आसान तरीका अब के लिए, एक एसक्यूएल प्रतिबंध उपयोग करने के लिए होगा:

criteria.add(Restrictions.sqlRestriction("BOOK_ID IN " + 
       "(SELECT BOOK_ID FROM Book_Authors " + 
       "WHERE authors = " + author + ")")); 

या आप अपनी खुद की कसौटी लिख सकते हैं।

4

क्या आपने HQL का उपयोग करने का प्रयास किया है?

SELECT bk FROM Book bk WHERE :author IN bk.authors 

एचक्यूएल आमतौर पर मानदंड से अधिक शक्तिशाली है, इसलिए आप इसके साथ फंस सकते हैं।

+0

का उपयोग कर सकते हैं मैं आपके साथ सहमत हूं। – Alex

2

आप वर्तमान में मानदंड API का उपयोग कर मूल्य प्रकारों के संग्रह से क्वेरी नहीं कर सकते हैं। Here समस्या है, जो एक ही समस्या का वर्णन करने वाले मंच पदों से लिंक है।

एचक्यूएल काम करता है, हालांकि।

+0

टिकट की ओर इशारा करने के लिए धन्यवाद। –

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