2010-06-04 18 views
5

मैं जनक नामित और बाल दो संस्थाओं, एक एक-से-कई रिश्ते में जुड़ा हुआ है। बाल इकाई में बुलियन isStudent संपत्ति है।हाइबरनेट मानदंड और पंक्ति संख्या प्रतिबंध

हाइबरनेट मानदंड एपीआई का उपयोग करके मैं कैसे प्राप्त करूं, सभी माता-पिता इकाइयों जिनमें कम से कम एक बच्चा isStudent = true है?

मैं उन सभी माता-पिता को गिनने के लिए प्रोजेक्शन ऑब्जेक्ट का उपयोग करने का प्रयास कर रहा था, जिनके पास संपत्ति के साथ कम से कम एक बच्चा सही ढंग से सेट है, और फिर उन पंक्तियों को वापस लौटाएं जिनकी पंक्ति गणना शून्य से अधिक है, जैसे कोड के निम्नलिखित भाग में (काम नहीं करता है, हालांकि):

Criteria criteria = getCurrentSession().createCriteria(Parent.class); 

criteria.setProjection(Projections.alias(Projections.rowCount(), "count")) 
.add(Restrictions.gt("count", 0)).createCriteria("children") 
.add(Restrictions.eq("isStudent", true)); 

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

उत्तर

9

यह मेरे लिए काम किया:

DetachedCriteria crit   = DetachedCriteria.forClass(Parent.class, "theparent"); 
DetachedCriteria countSubquery = DetachedCriteria.forClass(Child.class , "child" ); 

countSubquery 
    .add(Property.forName("theparent.id").eqProperty("parent.id")) 
    .setProjection(Projections.count("id")); 

crit.add(Subqueries.lt(Long.valueOf(0), countSubquery)); 

[संपादित करें: एक बग फिक्स्ड एक बाहर @brabene द्वारा बताया TZ]

कहाँ जनक एवं बाल जो द्विदिश संबंध नहीं है, अर्थात बाल एक क्षेत्र "जनक" है यह माता पिता है> 0 बच्चों देता है।

1

RobAu का उत्तर लगभग हमें आवश्यक है। लेकिन इसमें एक छोटी सी बग है: सबक्वायरीज़ के बजाय। gt (..) आपको सबक्वायरीज़ की आवश्यकता है। lt (...)

crit.add(Subqueries.lt(Long.valueOf(0), countSubquery)); 
+0

पीछे की ओर लगता है, लेकिन यह काम करता है! –

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