2012-09-05 11 views
6

द्वारा क्वेरी के परिणाम को संक्षिप्त करना मैं किसी अन्य क्वेरी के परिणामस्वरूप हाइबरनेट मानदंड क्वेरी के परिणाम सेट को संकीर्ण करने की कोशिश कर रहा हूं। मुझे पता है कि जेपीक्यूएल के साथ इस समस्या को कैसे हल करें:सबक्वायरी

FROM DocPackage p WHERE 
    EXISTS (SELECT g 
    FROM ObjectGroup g JOIN g.items i, Person per 
    WHERE g=p.applicantGroup 
     AND i.objectClass = 'org.cp.model.common.Person' 
     AND i.objectId=per.id 
     AND lower(concat(per.firstName,' ',per.lastName)) like :applicant 
) 

लेकिन मैं कल्पना नहीं कर सकता कि मानदंड के साथ ऐसी क्वेरी कैसे करें। मानदंड के साथ इस चयन को लागू करने के लिए कोई विचार? हाइबरनेट 3.3 का उपयोग किया जाता है।

युपीडी: इस समस्या को मैं निम्नलिखित मानदंड क्वेरी कर दिया है हल करने के लिए कोशिश कर रहा है:

Criteria resultCriteriaQuery = this.hibernateSession.createCriteria(DocPackage.class, "pack"); 
     DetachedCriteria personSubquery = DetachedCriteria.forClass(Person.class, "pers"). 
      add(Restrictions.like("pers.loFstLstName", "%" + searchObject.getApplicant().toLowerCase() + "%")). 
      add(Restrictions.eqProperty("itm.objectId", "pers.id")); 
     DetachedCriteria applicantsSubquery = DetachedCriteria.forClass(ObjectGroup.class, "objGrp"). 
      add(Restrictions.eqProperty("pack.applcantGroup", "objGrp")). 
      createAlias("objGrp.items", "itm"). 
      add(Restrictions.eq("itm.objectClass", "org.cp.model.common.Person")). 
      add(Subqueries.exists(personSubquery)); 
     resultCriteriaQuery.add(Subqueries.exists(applicantsSubquery)); 

लेकिन यह काम नहीं करता। मेरे पास resultCriteriaQuery.list() पर NullPointerException है। इस सवाल के साथ क्या गलत है? कोई विचार?

उत्तर

0

मामले का विश्लेषण करने के थोड़ा बेहतर है, यह HQL बयान मापदंड से अपने आप जेनरेट प्रिंट, आप कनेक्शन गुण में डाल करने के लिए है हाइबरनेट:

<property name="hibernate.show_sql" value="true" /> 
<property name="hibernate.format_sql" value="true" /> 

और डिबग करने के लिए लॉग।

एक बार जब आप इसे प्राप्त कर लेंगे, तो आप तुलना कर सकते हैं जिसके साथ आप उत्पन्न करना चाहते हैं और अंतर देखना चाहते हैं।

सादर,

0

आप Criteria.createCriteria(String) विधि के साथ उप मापदंड बना सकते हैं।

इस परिदृश्य पर मान लिया जाये: स्ट्रिंग:

कक्षा बी एक नाम है।

कक्षा ए में तत्व हैं: सेट करें।

अब आप (अन्य प्रतिबंध से अलग) केवल एक-वस्तुओं के लिए जहां नाम = "एक्स" के साथ एक बी है चाहता हूँ:

Criteria crit = session.createCriteria(A.class); 
<add your restrictions for A> 

Criteria narrow = crit.createCriteria("elements"); 
narrow.add(Restrictions.eq("name", "X"); 

// This will respect the constraints applied to narrow 
crit.list(); 
0

गैर जुड़े मिलती हाइबरनेट मानदंड एपीआई द्वारा समर्थित नहीं हैं।

FROM ObjectGroup g JOIN g.items i, Person per 

से मैं क्या देखते हैं, आप ObjectGroupItem और व्यक्ति के बीच एक स्पष्ट मानचित्रण बनाने की आवश्यकता होगी: इस पंक्ति में एक समस्या है। यह Hibernate @ किसी भी टिप्पणी के माध्यम से पूरा किया जा सकता है। Hibernate Annotations, अनुच्छेद 2.4.5.2 पर एक नज़र डालें। जब एसोसिएशन मैप किया जाएगा, उप क्वेरी में आवश्यक जुड़ने के लिए मानदंड # createCriteria() या मानदंड # createAlias ​​() का उपयोग करें। मुख्य क्वेरी में सबक्वायरी जोड़ने के लिए आप पहले से ही सही API का उपयोग कर रहे हैं।

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