2010-09-02 12 views
6

मैं शामिल तालिकाओं पर सॉर्टिंग का उपयोग नहीं कर सकता। मुझे समझाने दो;हाइबरनेट मानदंड api तालिका समस्या में शामिल हों

मेरे पास तीन टेबल हैं। उपयोगकर्ता, भूमिकाएं और user_roles। मेरी जेपीए इकाइयां उपयोगकर्ता, उपयोगकर्तारोल, उपयोगकर्ता रोल पीके, भूमिका हैं।

|User |  | UserRole |  | UserRolePK |  | Role | 
|--------|  |----------|  --------------  -------- 
|id  |  | pk  |  | user  |  | id | 
|name |      | role  |  | name | 

वास्तव में उत्पादन है कि मैं चाहता हूँ: "का चयन करें * user_roles उर शामिल हों उन यू पर u.ID = ur.UserID आदेश u.name करके से,"

इसलिए मैं हाइबरनेट मानदंड API का उपयोग करने का प्रयास करता हूं। की pk.user.name: models.UserRole

मैं कैसे तालिकाओं में शामिल होने पर मापदंड एपीआई का उपयोग कर सकते हैं

CriteriaImpl criteria = (CriteriaImpl) session.createCriteria(UserRole.class); 
criteria.addOrder(Order.asc("pk.user.name")); 
List userRoles = criteria.list(); 

त्रुटि संपत्ति हल नहीं कर सका है?

उत्तर

9

एक श्रेणी संदर्भ अन्य वर्गों आप बस प्रतिबंध और आदेश में उनके गुणों का उपयोग नहीं कर सकते हैं मदद की। आपको संदर्भित वस्तुओं के लिए उपनाम बनाना होगा और फिर अन्य ऑब्जेक्ट्स पर प्रतिबंधों और आदेशों को परिभाषित करने के लिए उपनाम का उपयोग करना होगा।

Criteria criteria = (CriteriaImpl) session.createCriteria(UserRole.class); 
criteria.createAlias("pk", "a1"); 
criteria.createAlias("a1.user", "a2"); 
criteria.addOrder(Order.asc("a2.name")); 
List userRoles = criteria.list(); 

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

+0

अच्छा लगता है लेकिन यह काम नहीं करता है। अज्ञात कॉलम 'a2x2_।'ऑर्डर क्लॉज' नाम ' और यह एसक्यूएल क्वेरी है जो मानदंड API द्वारा उत्पन्न की गई थी। __ "इस__ रोलिड को RoleID614_0_ के रूप में चुनें, this_. user_roles से उपयोगकर्ता आईडी 614_0_ के रूप में यूज़र आईडी__ 2 ए 2 एक्स # 3 –

+0

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

1

ठीक है, सब से पहले मुझे लगता है कि हम अपने संस्थाओं मैपिंग (जावा वर्ग)

दूसरी ओर देखना चाहिए, मैं अपने UserRole वर्ग एक उपयोगकर्ता उदाहरण के लिए एक संदर्भ है मान लेंगे।

@Entity 
    @Table (name="UserRole") 
    public class UserRole{ 

     User user; 

     @OneToMany //correct mapping here 
     public User getUser(){return this.user;} 


    } 

आप association नेविगेट करने के लिए createCriteria उपयोग करना चाहिए।

public List<UserRole> getRolesWithUser(){ 
    Criteria userRoleCriteria = session.createCriteria(UserRole.class); 
    userRoleCriteria.createCriteria("user"); //joins the table. 
    userRoleCriteria.addOrder("user.name"); //adds order 

    return criteria.list(); 
} 

इस के साथ समस्या यह है कि यह UserRole के उदाहरण लाएगा, लेकिन आप User पर नेविगेट कर सकते है।

List<UserRole> userRoles = getRolesWithUser(); 

for (UserRole role:userRoles){ 

    User user = role.getUser(); 
    //do something with role , user 
} 

Criteria API पर एक नज़र डालें। यह हमेशा सहायक है!

+0

उपयोगकर्ता_रोल्स तालिका में उपयोगकर्ता आईडी और रोलआईडी कॉलम प्राथमिक कुंजी हैं। इसलिए मैंने इसके लिए एम्बेडेड कुंजी और अतिरिक्त क्लास (UserRolePK) का उपयोग किया। उपयोगकर्तारोलपीके में सही मैपिंग है। –

1

काफी आसान सिर्फ संघों पर createCriteria का उपयोग करें:

Criteria c=session.createCriteria(User.class) 
        .createCriteria("roles") 
        .add(Restrictions.eq("name","test") 
        .list(); 

यह entites उपयोगकर्ता और उनके संबद्ध संग्रह "भूमिकाओं के लिए" दो तालिकाओं में शामिल हो जाएगा। और उन सभी उपयोगकर्ताओं को वापस कर देगा जिनके साथ "टेस्ट" नामक भूमिका निभाई गई है।

आशा व्यक्त की कि

+0

उपयोगकर्ता इकाई में भूमिकाओं जैसे कई रिलेशन प्रॉपर्टी के लिए बहुत कुछ नहीं है। इसके बजाय मैंने UserRole इकाई का उपयोग किया। –

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