2009-12-14 10 views
13

Seu निम्नलिखित मानचित्रणहाइबरनेट HQL क्वेरी

@Entity 
public class User { 

    private Integer id; 

    @Id; 
    private Integer getId() { 
     return this.id; 
    } 

} 

सूचना आईडी ऑपरेटर की तरह उपयोग करके एक पूर्णांक है। अब मैं ऑपरेटर की तरह का उपयोग कर

Query query = sessionFactory.getCurrentSession().createQuery("from User u where u.id like :userId"); 

ATT द्वारा इस HQL क्वेरी की जरूरत है: IT IS तरह ऑपरेटर नहीं = (के बराबर होती है ऑपरेटर)

तब मैं

List<User> userList = query.setParameter("userId", userId + "%").list(); 

का उपयोग लेकिन ऐसा नहीं करता काम करें क्योंकि हाइबरनेट शिकायत करता है IllegalArgumentException उपयोगकर्ता.आईडी

यहां तक ​​कि जब मैं

query.setString("userId", userId + "%"); 

यह

क्या मैं क्वेरी पारित करने के लिए उपयोग करना चाहिए काम नहीं करता है का उपयोग करें?

+0

आप क्या डेटाबेस इंजन का उपयोग कर रहे काम करता है? –

+0

@ आर्थर - आपके प्रश्न का उत्तर नहीं दे रहा है (ऐसा लगता है कि आपने इसे अपने आप से बाहर निकाला है) लेकिन मुझे अभी पूछना है - क्यों? मैं वास्तव में दिलचस्पी रखता हूं - आपके पास क्या मामला है जिसके लिए सरोगेट कुंजी होने के लिए तुलना की आवश्यकता है? – ChssPly76

+0

@ ChssPly76 - हाय Chss। यह एक विरासत प्रणाली है। यह वृक्ष संरचना है जहां एक अभिभावक समूह आईडी सभी बच्चों की आईडी से मेल खाता है। उदाहरण के लिए, यदि मेरे पास समूह आईडी = 22100 है और मैं 221 उपसर्ग से मेल करके अपने बच्चों को पुनर्प्राप्त करना चाहता हूं, तो मैं >>> '221%' की तरह >>> का उपयोग करता हूं। –

उत्तर

25

हाइबरनेट संदर्भ के अनुसार:

str() एक पठनीय स्ट्रिंग

को सांख्यिक या अस्थायी मान परिवर्तित करने के लिए प्रयोग किया जाता है

तो जब मैं

का उपयोग करता हूं
from User u where str(u.id) like :userId 

यह ठीक

+0

हां यह है। str() मुझे समाधान दिया। मैंने एक ही मुद्दे पर संघर्ष किया क्योंकि मेरी इकाई वर्ग में लंबा क्षेत्र है। मैंने हाइबरनेट को ऑपरेटर की तरह इस्तेमाल किया और उसने मुझे अपवाद दिया। समाधान Hiberanate str() विधि के साथ मिला और मैंने हाइबरनेट क्वेरी का उपयोग किया। नमूना क्वेरी पाएं। बिल बी से b.billNumber का चयन करें जहां str (b.billNumber) जैसे: बिल नम्बर ")। सेटस्ट्रिंग (" बिल नम्बर, your_parameter) .list(); –

+0

महान समाधान। आकर्षक ... – bynu022

7

ठीक है, जैसे ऑपरेटर आमतौर पर टेक्स्ट डेटा के साथ उपयोग किया जाता है यानी VARCHAR या CHAR कॉलम के साथ, और आपके पास संख्यात्मक id कॉलम (INTEGER) है।

शायद आप id फ़ील्ड को स्ट्रिंग के रूप में भी मैप करने और क्वेरी में उस क्षेत्र का उपयोग करने का प्रयास कर सकते हैं। यह आपके डेटाबेस इंजन के आधार पर काम कर सकता है या नहीं भी हो सकता है। ध्यान दें कि आपको setId() के माध्यम से सभी अपडेटों को संभालना चाहिए और केवल पढ़ने के लिए idAsString फ़ील्ड पर विचार करें।

 
@Entity 
public class User { 

    private Integer id; 
    private String idAsString; 

    @Id; 
    private Integer getId() { 
     return this.id; 
    } 

    private void setId(Integer id) { 
     this.id = id; 
    } 

    @Column(name="id", insertable=false, updatable=false) 
    private String getIdAsString() { 
     return this.idAsString; 
    } 

    private void setIdAsString(String idAsString) { 
     this.idAsString = idAsString; 
    } 
} 

फिर क्वेरी होगा:

Query query = sessionFactory.getCurrentSession().createQuery("from User u where u.idAsString like :userId"); 
List<User> userList = query.setParameter("userId", userId + "%").list();