2012-03-06 13 views
5

का उपयोग कर एचक्यूएल क्लॉज लिखें, मैं एक ऐसी विधि लिखना चाहता हूं जो फ़ील्ड 'serviceId' द्वारा समूहित अंतिम अतिरिक्त ऑब्जेक्ट्स की एक सूची लौटाती है।हाइबरनेट मानदंड API

निम्नलिखित HQL काम करता है, लेकिन मैं इस का उपयोग कर मानदंड एपीआई लिखना चाहते हैं:

FROM Notification WHERE date IN 
    (SELECT MAX(date) FROM Notification GROUP BY serviceId) 
ORDER BY date ASC 

कुछ इस तरह:

Criteria crit = session.createCriteria(Notification.class); 
crit.add(Restrictions.in("date", <MAX dates>)); 
criteria.addOrder(Order.desc("date")); 

अग्रिम धन्यवाद।

संपादित करें:

अब मैं एक ऐसी ही क्वेरी कि eclipselink एपीआई =/
मूल रूप से का उपयोग कर काम करता है की जरूरत है, मैं पिछले एन पंक्तियों (अधिकतम तारीख) है, जो स्थिति पाँच में से एक bellow वर्णन किया गया है की जरूरत है, serviceId कॉलम द्वारा समूहित।
मेरी अनुभवहीनता के कारण, यह सबसे अच्छा मैं कर सकता था:

ExpressionBuilder builder = new ExpressionBuilder(); 
Expression exStatus1 = builder.get("status").equal(MessageType.START.toString()); 
Expression exStatus2 = builder.get("status").equal(MessageType.RUNNING.toString()); 
Expression exStatus3 = builder.get("status").equal(MessageType.PAUSED.toString()); 
Expression exStatus4 = builder.get("status").equal(MessageType.END_ERROR.toString()); 
Expression exStatus5 = builder.get("status").equal(MessageType.END_SUCCESS.toString()); 

ReadAllQuery query = new ReadAllQuery(); 
query.setReferenceClass(Notification.class); 
query.setSelectionCriteria(((exStatus1).or(exStatus2).or(exStatus3).or(exStatus4).or(exStatus5))); 
query.setMaxRows(listSize); 
query.addDescendingOrdering("date"); 

खंड परिणाम पंक्तियां में डुप्लिकेट serviceIds से बचने के लिए याद आ रही है ...

उत्तर

4

आप मानदंड अनुमानों का उपयोग करना चाहते करने जा रहे हैं एक अलग सबक्वायरी के साथ एपीआई:

Criteria crit = session.createCriteria(Notification.class, "main"); 

DetachedCriteria notificationSubQuery = DetachedCriteria.forClass(Notification.class, "sub"); 
notificationSubQuery.setProjection(Projections.max("date")); 
notificationSubQuery.add(Restrictions.eqProperty("sub.serviceId", "main.serviceId")); 

crit.add(Subqueries.propertyIn("date", notificationSubQuery)); 
crit.addOrder(Order.desc("date")); 

यह आपके एचक्यूएल क्वेरी में उपयोग की जाने वाली तकनीक को प्रतिबिंबित करता है।

संपादित:

FROM Notification main WHERE date IN 
    (SELECT MAX(sub.date) FROM Notification sub WHERE sub.serviceId = main.serviceId) 
ORDER BY date ASC 

इस मामले में जहां से बचाता है:

मैं क्वेरी आपका मुख्य अधिसूचना वर्ग और अपने उप क्वेरी, इस HQL क्वेरी के रूप में मूलतः एक ही के बीच serviceId के लिए अपडेट कर दो अलग-अलग सेवा आईडी के बीच एक गैर-अधिकतम दिनांक मिलान होगा:

serviceId = 1: date = 3,4,5 
serviceId = 2: date = 4,5,6 

पुरानी क्वेरी वापसी :

serviceId: 1, date: 5 
serviceId: 2, date: 5,6 

नई क्वेरी वापसी:

serviceId: 1, date: 5 
serviceId: 2, date: 6 

मुझे पता है अगर यह आपके लिए काम करता है।

+1

लेकिन ओपी चाहता है कि सबक्वायरी 'आईडीआई द्वारा अधिसूचना समूह से अधिकतम (दिनांक) का चयन करें, बल्कि' अधिसूचना से अधिकतम (दिनांक) का चयन करें –

+0

मेरी गलती, अद्यतन। –

+0

ठीक काम करता है! धन्यवाद। – elias

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