2011-07-21 19 views
6

मुझे हाइबरनेट में एक देशी क्वेरी का उपयोग करने में परेशानी हो रही है जिसमें एक बीन है जिसमें enum गुण होते हैं। Query.list() को कॉल करते समय मुझे एक InvocationTargetException मिल रहा है। मेरे उदाहरण नीचे है:हाइबरनेट - एनम गुणों के साथ बीन के लिए मूल क्वेरी और उपनाम का उपयोग करें?

@Entity(name = "table1") 
public class Class1 { 
    @Column(name = "col1") 
    @NotNull 
    private Integer prop1; 

    @Column(name = "col2") 
    @NotNull 
    private String prop2; 

    @Column(name = "col3", length = 6) 
    @Enumerated(value = EnumType.STRING) 
    private MyEnumType prop3; 

    // ... Getters/Setters... 
} 

public List getClass1List(){ 
    String sql = "select col1 as prop1, col2 as prop2, col3 as prop3 from table1"; 

    Session session = getSession(Boolean.FALSE); 
    SQLQuery query = session.createSQLQuery(sql); 
    query.addScalar("col1", Hibernate.INTEGER); 
    query.addScalar("col2", Hibernate.STRING); 
    query.addScalar("col3", Hibernate.STRING); 

    query.setResultTransformer(Transformers.aliasToBean(Class1.class)); 

    return query.list(); 
} 

query.addScalar के दौरान ("col3", Hibernate.STRING) कॉल, मैं किस प्रकार (enum प्रकार) col3 के लिए उपयोग करने के लिए पता नहीं है। Hibernate.String काम नहीं कर रहा है! मैंने पूरी तरह से टाइप को छोड़ने की कोशिश की है (query.addScalar ("col3")) लेकिन मुझे वही InvocationTargetException मिलता है। क्या कोई भी इस के साथ मेरी मदद कर सकता है? मेरा मॉडल बदला नहीं जा सकता है और मैं देशी एसक्यूएल क्वेरी के साथ फंस गया हूं। किसी भी विचार की सराहना की जाती है।

+0

यदि आप अपने एसक्यूएल स्टेटमेंट में "col1 as prop1" को अलियासिंग कर रहे हैं, तो क्या हाइबरनेट इसे मैप करने में सक्षम होगा? –

उत्तर

2

सबसे पहले, आपको

private EnumType prop3; 

लेकिन

private ActualEnum prop3; 

उपयोग नहीं करना चाहिए (उदाहरण के लिए, Fruits सेब और संतरे भेद करने के लिए) जहां ActualEnum अपनी खुद की enum प्रकार है।

दूसरा, जब आप मूल एसक्यूएल का उपयोग करते हैं तो मैपिंग हाइबरनेट अप्रासंगिक है।

अब, कुछ विकल्प हैं जो मैं प्रस्तावित कर सकता हूं। आप स्केलर के गुच्छा के बजाय addEntity() का उपयोग करने का प्रयास कर सकते हैं। यह संभव है कि हाइबरनेट एनम संपत्ति को पहचान लेगा और सही तरीके से मानचित्र करेगा।

अन्य विकल्प गैर सार्वजनिक सेटटर होना है जो डेटाबेस से स्ट्रिंग लेगा, इसे enum में परिवर्तित करें और वास्तविक संपत्ति सेट करें।

अंत में, आप ट्रांसफॉर्मर को कस्टमाइज़ कर सकते हैं। लेकिन यह शायद सबसे जटिल विकल्प है।

+0

मैं वास्तव में अपने स्वयं के enum प्रकार का उपयोग कर रहा हूँ, यह शुद्ध संयोग और लापरवाही से था कि मैंने EnumType का उपयोग किया। प्रश्न संपादित किया गया है, अच्छा पकड़ो। मैं पोस्ट करने से पहले दूसरे विकल्प के साथ गया, इसलिए मैं पहला विकल्प एक कोशिश दूंगा। मेरे प्रश्न में बदलावों को दर्शाने के लिए अपने उत्तर को संपादित करने के लिए स्वतंत्र महसूस करें। – javagruffian

3
// In public List getClass1List() method: 
// 1. DEFINE: 
Properties params = new Properties(); 
params.put("enumClass", "enumerators.MyEnumType"); 
params.put("type", "12"); 

// 2. REPLACE: 
// query.addScalar("col3", Hibernate.STRING); 
// X 

query.addScalar("col3", Hibernate.custom(org.hibernate.type.EnumType.class, params)); 
संबंधित मुद्दे