2009-11-12 6 views
25

मुझे हाइबरनेट मानदंडों में समस्याएं आ रही हैं। मैं एक मानदंड बनाने की कोशिश कर रहा हूं जहां मैं कक्षा के सदस्य ऑब्जेक्ट की आईडी को क्वेरी रिटर्न देता हूं।जावा/हाइबरनेट: नेस्टेड ऑब्जेक्ट मानदंडों के साथ संपत्ति का समाधान नहीं कर सका

उदाहरण के लिए:
org.hibernate.QueryException: could not resolve property: lecture.admin.id of: xxx.yyy.Enquiry

Enquiry वर्ग व्याख्यान चर, जो बारी में व्यवस्थापक चर शामिल होते हैं करता है:

Criteria crit = session.createCriteria(Enquiry.class); 
crit.add(Expression.eq("lecture.admin.id", userId));` 

इसी का परिणाम एक अपवाद है। मैंने lecture.id का उपयोग करने का प्रयास किया है और यह ठीक काम करता है।

क्या इस तरह के ऑब्जेक्ट पदानुक्रम को नीचे जाने वाले स्तरों की संख्या की सीमा है?

धन्यवाद!

कोड के टुकड़े:

public Integer getId() { 
    if (id != null) { 
    return id; 
    } 
    return TransferBean.NOT_SET; 
} 

हाइबरनेट मानचित्रण एक्सएमएल से:

public class Lecture extends TransferItem { 
    private User admin; 
    public User getAdmin() { 
    return admin; 
    } 
} 

'उपयोगकर्ता' वर्ग Person वर्ग, जो बारी में एक Item वर्ग फैली हुई है, जो getId() विधि है फैली :

<class name="User" table="user"> 
    <id column="user_id" name="id"> 
    <generator class="increment"/> 
    </id> 
    ... 

<class name="Lecture" table="lecture"> 
    <many-to-one class="User" column="user_fk" lazy="false" name="admin"/>` 

यह है user तालिका:

mysql> show columns from user; 
+-----------------+--------------+------+-----+---------+-------+ 
| Field   | Type   | Null | Key | Default | Extra | 
+-----------------+--------------+------+-----+---------+-------+ 
| user_id   | int(11)  | NO | PRI |   |  | 
| firstname  | varchar(50) | YES |  | NULL |  | 
| lastname  | varchar(50) | YES |  | NULL |  | 
| signature  | varchar(16) | YES |  | NULL |  | 
| email_signature | varchar(256) | YES |  | NULL |  | 
| password  | varchar(32) | YES |  | NULL |  | 
| phone   | varchar(16) | YES |  | NULL |  | 
| email   | varchar(255) | YES | UNI | NULL |  | 
| lecturer_fk  | int(11)  | YES | MUL | NULL |  | 
| access   | int(11)  | YES |  | NULL |  | 
| deleted   | tinyint(1) | YES |  | NULL |  | 
+-----------------+--------------+------+-----+---------+-------+ 
11 rows in set (0.02 sec)` 

उत्तर

68

आप सीधे मानदंड एपीआई (एचक्यूएल के विपरीत) में नेस्टेड पथ का उपयोग नहीं कर सकते हैं।

Criteria criteria = session.createCriteria(Enquiry.class) 
.createAlias("lecture", "l") 
.createAlias("l.admin", "a") 
.add(Restrictions.eqProperty("a.id", userId)); 

ध्यान दें कि पहले ही संपत्ति पहले से जुड़ा हुआ नहीं है के रूप में यह के अंतर्गत आता है: इसके बजाय, आप नेस्टेड मापदंड उदाहरण बना या पहले गैर-मूल इकाई के साथ शुरू प्रत्येक "entity.property" जोड़ी पर उपनाम परिभाषित करने की जरूरत रूट इकाई (Enquiry), अन्य पिछले स्तर के उपनाम के साथ prefixed हैं। विवरण in the documentation हैं।

यह भी ध्यान दें कि id एसोसिएशन की बात करते समय एक विशेष संपत्ति है; आपके मामले में user_fklecture तालिका में स्थित एक कॉलम है।

Criteria criteria = session.createCriteria(Enquiry.class) 
.createAlias("lecture", "l") 
.add(Restrictions.eqProperty("l.admin.id", userId)); 

इस प्रकार अतिरिक्त में शामिल होने को नष्ट: यह, इसलिए, संभव (बशर्ते कि मैपिंग द्वारा पोस्ट की गई सटीक हैं) के रूप में उपरोक्त मानदंडों के पुनर्लेखन के लिए होना चाहिए।

+0

आह, बहुत अच्छा बिंदु। – Henning

+0

हमेशा सामान्य @ ChssPly76 –

+0

के रूप में निर्देशक यह खूबसूरती से काम करता है। सहायता के लिए आपका बहुत - बहुत धन्यवाद। – Malakim

2
Criteria crit = session.createCriteria(Enquiry.class) 
crit.createAlias("lecture.admin", "lectureAdmin"); 
crit.add(Expression.eq("lectureAdmin.id", userId)); 

आप वास्तव में मुद्दों मारा जब आप नीचे वस्तु ग्राफ में बहुत गहरा जा सकते हैं। जैसा कि ऊपर दिखाया गया है, मैं आमतौर पर उपनाम बनाकर इसे प्राप्त करता हूं।

+1

मैं इस कोशिश की, लेकिन मैं तो एक SQLGrammarException मारा बजाय: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: की वजह से अज्ञात कॉलम में 'जहां खंड' कोई भी विचार 'lectureadm1_.user_id'? – Malakim

+0

यह डेटाबेस से आने वाली त्रुटि की तरह दिखता है कि "उपयोगकर्ता" तालिका पर "user_id" कॉलम नहीं है। क्या आप सुनिश्चित हैं कि डेटाबेस तालिका में यह कॉलम है?शायद डेटाबेस पर कॉलम को "आईडी" भी कहा जाता है, अगर ऐसा होता है तो आप मैपिंग को हाइबरनेट करते हैं। –

+0

मैंने उपयोगकर्ता डेटाबेस तालिका को पर जोड़ा गया धन्यवाद! – Malakim

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