2013-05-15 6 views
6

का उपयोग करके हाइबरनेट मानदंड मैं अपने मानदंडों में GROUP BY का उपयोग करने का प्रयास कर रहा हूं। मैं ऐसा करने की जरूरत:ग्रुप बाय और रिटर्न ईंटिटी लिस्ट

SELECT b FROM Book b GROUP BY volumeCode; 

मैं कोड निम्नलिखित है:

Criteria c = s.createCriteria(Book.class); 
    c.setProjection(Projections.projectionList().add(Projections.groupProperty("volumeCode"))); 
    List<Book> result = c.list(); 

लेकिन इस मापदंड रिटर्न केवल volumeCode रों (स्ट्रिंग्स की एक सूची)। मुझे Book एस की सूची प्राप्त करने की आवश्यकता है। तो मैंने ट्रांसफॉर्मर्स का उपयोग करने की कोशिश की:

Criteria c = s.createCriteria(Book.class); 
    c.setProjection(Projections.projectionList().add(Projections.groupProperty("volumeCode"))); 
    c.setResultTransformer(Transformers.aliasToBean(Book.class)); 
    List<Book> result = c.list(); 

यह कोड शून्य मानों की सूची देता है। क्या मानदंडों के साथ ऐसा करना संभव है?

उत्तर

5

सबसे पहले, प्रोजेक्ट डेटा को पुनर्प्राप्त करने की मात्रा को फ़िल्टर करता है, यदि आप अधिक डेटा चाहते हैं, तो आपको प्रोजेक्शन में उन गुणों को भी जोड़ना चाहिए।

उदाहरण:

c.setProjection(Projections.projectionList() 
    .add(Projections.property("id").as("id")) 
    .add(Projections.property("descripction").as("description")) 
    .add(Projections.groupProperty("volumeCode").as("volumeCode"))); 

अब, ट्रांसफार्मर यह क्या कहते हैं, "बीन करने के लिए उर्फ", यह आपके जावा सेम "Book.java" के गुणों के साथ एक उपनाम मैच करता है।

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

ट्रांसफार्मर के बिना, अगर प्रक्षेपण एक से अधिक संपत्ति है, परिणाम बाहर इस तरह आता है:

for(Object[] item:criteria.list()){ 
    System.out.println((String)item[0]); //ID 
    System.out.println((String)item[1]); //Description 
    System.out.println((String)item[2]); //Volume code 
} 

यही कारण है कि आप कलाकारों अपवाद मिल रहे थे, ट्रांसफार्मर के बारे में, अपने जावा बीन के संपत्ति नाम के साथ हर उपनाम से मिलान करने का प्रयास करें।

+0

हैलो ज़ियुल, आपके उत्तर के लिए thx। आपकी सलाह के साथ मुझे ऑब्जेक्ट्स की सूची मिलती है लेकिन जावा अपवाद को फेंक देता है जब मैं सूची से किसी ऑब्जेक्ट को पुस्तक में डालने का प्रयास करता हूं। –

+0

एहम, मैं ट्रांसफॉर्मर ओ के साथ लाइन हटाता हूं: -) ... इस लाइन को वापस जोड़ने के बाद भी मुझे शून्य वस्तुओं की सूची मिलती है। –

+0

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

2

मुझे लगता है कि आप का उपयोग कर सकते हैं: criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

+0

आपको लगता है? क्यूं कर? कैसे? – rayryeng

+1

@rayryeng मुझे वही समस्या का सामना करना पड़ता है जो 'पी से व्यक्ति पी समूह से व्यक्ति आईडी' मानदंडों का उपयोग करके प्राप्त करने की कोशिश कर रहा है लेकिन सेटप्रोजेक्शन का उपयोग करके इसे इसे 'व्यक्ति से चुनिंदा डिस्टिंट (व्यक्ति आईडी) के बराबर एसक्यूएल में परिवर्तित करें और व्यक्ति की वापसी सूची id wheres i पूरे व्यक्ति वस्तु की आवश्यकता है और 'सूची सूची = session.createCriteria ("व्यक्ति", "पी") .setResultTransformer (Criteria.DISTINCT_ROOT_ENTITY);' व्यक्ति ऑब्जेक्ट की सूची वापस करें। क्यों और कैसे उम्मीद है कि यह मदद करेगा [यहां] (http://stackoverflow.com/questions/10961048/setresulttransformer-in-criteria) – Mazrul

+0

इसे अपनी पोस्ट में जोड़ें। हम नहीं जानते थे कि इससे आपको शुरुआत में क्यों मदद मिली – rayryeng

3

cz_Nesh। मेरे पहले जवाब के बारे में खेद है। मैं हाइबरनेट एपीआई पढ़ता हूं और कुछ हाइबरनेट स्रोत कोड पढ़ता हूं जो मुझे लगता है। यदि आप इस कोड

session.createCriteria(EmpUserImpl.class).list(); 

का उपयोग यह सूची EmpUserImpl वापस आ जाएगी। यदि आप इस कोड

 criteria.setProjection(Projections.projectionList() 
      .add(Projections.groupProperty("company").as("company")) 
      .add(Projections.property("name").as("name")) 
      .add(Projections.property("company").as("company"))); 
     List list = criteria.list(); 

यह सूची वापस आ जाएगी उपयोग करते हैं, EmpUserImpl सूची नहीं है क्यों? मुझे लगता है कि मानदंड के मूल वर्ग मानदंड स्पेसिफिकेशन मुझे लगता है।

public interface CriteriaSpecification { 

/** 
* The alias that refers to the "root" entity of the criteria query. 
*/ 
public static final String ROOT_ALIAS = "this"; 

/** 
* Each row of results is a <tt>Map</tt> from alias to entity instance 
*/ 
public static final ResultTransformer ALIAS_TO_ENTITY_MAP = AliasToEntityMapResultTransformer.INSTANCE; 

/** 
* Each row of results is an instance of the root entity 
*/ 
public static final ResultTransformer ROOT_ENTITY = RootEntityResultTransformer.INSTANCE; 

/** 
* Each row of results is a distinct instance of the root entity 
*/ 
public static final ResultTransformer DISTINCT_ROOT_ENTITY = DistinctRootEntityResultTransformer.INSTANCE; 

/** 
* This result transformer is selected implicitly by calling <tt>setProjection()</tt> 
*/ 
public static final ResultTransformer PROJECTION = PassThroughResultTransformer.INSTANCE; 

/** 
* Specifies joining to an entity based on an inner join. 
* 
* @deprecated use {@link org.hibernate.sql.JoinType#INNER_JOIN} 
*/ 
@Deprecated 
public static final int INNER_JOIN = JoinType.INNER_JOIN.getJoinTypeValue(); 

/** 
* Specifies joining to an entity based on a full join. 
* 
* @deprecated use {@link org.hibernate.sql.JoinType#FULL_JOIN} 
*/ 
@Deprecated 
public static final int FULL_JOIN = JoinType.FULL_JOIN.getJoinTypeValue(); 

/** 
* Specifies joining to an entity based on a left outer join. 
* 
* @deprecated use {@link org.hibernate.sql.JoinType#LEFT_OUTER_JOIN} 
*/ 
@Deprecated 
public static final int LEFT_JOIN = JoinType.LEFT_OUTER_JOIN.getJoinTypeValue(); 

}

आप सार्वजनिक स्थिर अंतिम ResultTransformer अनुमान देख सकते हैं? यह कहता है कि इस परिणाम ट्रांसफॉर्मर को setProjection() पर कॉल करके स्पष्ट रूप से चुना जाता है, जब आप मानदंड का उपयोग करते हैं .setProjection, परिणाम EmpUserImpl की सूची नहीं देगा, क्योंकि परिणाम ट्रान्सफ़ॉर्मर "ROOT_ENTITY" से "प्रोजेक्शन" में बदल जाता है। यह प्रोजेक्शन द्वारा पैकेजिंग करेगा (चुनिंदा नाम, ओआईडी ..)। इसलिए, यदि आप सूची EmpUserImpl को वापस करना चाहते हैं तो आपको Projections.property ("name") सेट करना होगा ("name")।, (यदि आपको नाम की आवश्यकता है तो बस नाम सेट करें)। यह मेरा कोड है।

 Criteria criteria = session.createCriteria(EmpUserImpl.class); 
    criteria.setProjection(Projections.projectionList() 
      .add(Projections.groupProperty("company").as("company")) 
      .add(Projections.property("name").as("name")) 
      .add(Projections.property("company").as("company"))); 
    criteria.setResultTransformer(Transformers.aliasToBean(EmpUserImpl.class)); 
    List<EmpUserImpl> list = criteria.list(); 
    for (EmpUserImpl empUserImpl : list) { 
     System.out.println(empUserImpl.getName()); 
    } 

यह काम कर सकता है। उम्मीद है यह आपकी मदद कर सकता है।

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