2009-01-21 17 views
10

हैवींग क्लॉटरिया एपीआई का उपयोग करके एक विशेष मूल्य के सारांश को पकड़ने के लिए एक प्रश्न लिखा है, अब मुझे परिणामों को पंक्तियों तक सीमित करने में सक्षम होना चाहिए, एक विशेष मूल्यहाइबरनेट मानदंड एपीआई -

आम तौर पर मैं ऐसा करने के लिए अपने एसक्यूएल में एक हैविंग क्लॉज का उपयोग करता हूं, लेकिन इस समय मानदंड एपीआई इसका समर्थन नहीं कर रहा है।

SELECT user_pk, sum(amount) as amountSum 
FROM transaction 
GROUP BY user_pk 
HAVING amountSum >=50; 

एक काम के आसपास है कि मैं के बारे में सोचा में एक सबक्वेरी का उपयोग FROM खंड है कि इस योग मूल्य पकड़ लेता है और एक बाहरी क्वेरी का उपयोग करने के लिए है:

कच्चे एसक्यूएल इस में मैं यह क्या करने की जरूरत है एक WHERE खंड का उपयोग कर इसे प्रतिबंधित करने के लिए।

तो, कच्चे एसक्यूएल में यह कुछ ऐसी दिखाई देगी:

SELECT user_pk, amountSum 
FROM (SELECT user_pk, sum(amount) as amountSum 
     FROM transaction 
     GROUP BY user_pk) 
WHERE amountSum > 50; 

किसी को कैसे मैं इस का उपयोग कर मानदंड एपीआई लिख सकता है, या किसी अन्य सुझाव/काम arounds मैं के रूप में सही दिशा में मुझे बात कर सकते हैं हैविंग मुद्दे को हल करने के लिए उपयोग कर सकते हैं?

यह वह जगह है मैं ऊपर के उदाहरण

DetachedCriteria criteria = DetachedCriteria.forClass(Transaction.class,"transaction"); 
criteria.setProjection(criteria.setProjection(Projections.projectionList().add(
     Projections.groupProperty("user.userPK").as("user_pk")).add(
      Projections.sum("transaction.amount").as("amountSum"))); 

धन्यवाद के लिए है मानदंड एपीआई कोड!

उत्तर

8

मुझे FROM खंड में एक सबक्वायरी का उपयोग करने के लिए हाइबरनेट/एनएचबीरनेट के लिए एक तरीका नहीं पता है, लेकिन आप उन्हें WHERE खंड में उपयोग कर सकते हैं। किसी भी जावा/हाइबरनेट कोड गलतियों के लिए माफ़ी, मैं सी #/एनएचबीरनेट से अधिक परिचित हूं।

 

DetachedCriteria subQuery = DetachedCriteria.forClass(Transaction.class); 
subQuery.setProjection(Projections.sum("amount")); 
subQuery.add(Expression.eqProperty("userPk", "tOuter.userPk")); 

DetachedCriteria outerQuery = DetachedCriteria.forClass(Transaction.class, "tOuter"); 
outerQuery.setProjection(Projections.projectionList() 
    .Add(Projections.sum("amount").as("sumAmount")) 
    .Add(Projections.groupProperty("userPk").as("user_pk")); 
outerQuery.add(Subqueries.le(50, subQuery)); 

 

इस कोड को एसक्यूएल के समान में परिणाम चाहिए:

 

SELECT tOuter.userPk as user_pk, sum(tOuter.amount) as sumAmount 
FROM transaction tOuter 
WHERE 50 <= (SELECT sum(amount) FROM transaction WHERE userPk = tOuter.userPk) 
GROUP BY tOuter.userPk 
 

इस दृष्टिकोण का नुकसान यह है कि यह रकम में से प्रत्येक के दो बार की गणना करता है, इस राशि के आधार पर प्रदर्शन पर एक हानिकारक प्रभाव हो सकता है है डेटा शामिल है - इस मामले में आप एक एचक्यूएल क्वेरी का उपयोग करना चाहेंगे जो हैविंग क्लॉज का समर्थन करता है।

2

HHH -1700 HHH-1043 के डुप्लिकेट के रूप में चिह्नित किया गया है, और इसलिए तय नहीं किया जाएगा। आपको HHH-1043 पर मेरा समाधान और कामकाज, साथ ही साथ अन्य लोगों को भी मिल जाएगा।

+0

यह 7 साल पहले था और अभी भी हाइबरनेट के अंदर पैच नहीं किया गया है, मुझे संस्करण 4.3.6 या नए के लिए पैच लागू करने की आवश्यकता है, लेकिन कोड इतना बदल गया है कि मुझे यह स्पष्ट नहीं है कि यह कैसे किया जाए। किसी को भी यह पैच अद्यतन किया गया है? –

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