2011-08-02 24 views
17

के फ़िल्टर परिणामों के लिए एनोटेशन मेरे पास दो टेबल के बीच माता-पिता/बाल संबंध हैं, और मेरे जावा कक्षाओं में संबंधित मैपिंग है। टेबल लगभग कि तरह लग रहे:@OneToMany एसोसिएशन

A (ref number, stuff varchar2(4000)) 
B (a_ref number, other number, foo varchar2(200)) 

और जावा कोड:

@Entity 
class A { 
    @Id 
    @Column(name = "REF") 
    private int ref; 

    @OneToMany 
    @JoinColumn(name = "A_REF", referencedName = "REF") 
    private Set<B> bs; 
} 

@Entity 
class B { 
    @Id 
    @Column(name = "A_REF") 
    private int aRef; 

    @Id 
    @Column(name = "OTHER") 
    private int other; 
} 

यह ठीक काम करता है, लेकिन मैं पंक्तियों कि मैं बच्चे को मेज से पुनः प्राप्त पर एक फिल्टर जोड़ना चाहते हैं। क्वेरी जो उत्पन्न होता है जैसा दिखता है:

select a_ref, other, foo from B where a_ref = ? 

और मैं चाहता हूँ यह हो:

select a_ref, other, foo from B where a_ref = ? and other = 123 

अतिरिक्त फिल्टर केवल एक स्तंभ नाम और एक हार्ड-कोडेड मूल्य होगा। क्या हाइबरनेट एनोटेशन का उपयोग करने का कोई तरीका है?

मैंने @JoinFormula पर देखा है, लेकिन इसके साथ मुझे हमेशा मूल तालिका से कॉलम नाम का संदर्भ देना होगा (name जॉइनफॉर्मुला की विशेषता में)।

किसी भी सलाह के लिए अग्रिम धन्यवाद।

+0

उत्सुक, क्यों न केवल पैरामीटर के रूप में इसे पास करें? 'जहां a_ref =? और अन्य =? '। यदि आपके पास ऐसा करने की ज़रूरत है तो मुझे उस मूल्य को हार्डकोड किया जा सकता है (हालांकि मैं कॉन्फ़िगर करने योग्य गुण प्रणाली का उपयोग करने का सुझाव दूंगा)। – ADTC

उत्तर

26

यह जेपीए द्वारा समर्थित नहीं है, लेकिन यदि आप जेपीए प्रदाता के रूप में हाइबरनेट का उपयोग कर रहे हैं तो आप एनोटेशन @FilterDef और @Filter का उपयोग कर सकते हैं।

Hibernate Core Reference Documentation

Hibernate3 को फ़िल्टर मापदंड पूर्व परिभाषित करने और दोनों एक वर्ग स्तर और एक संग्रह स्तर पर उन फ़िल्टर देते हैं की क्षमता है। एक फिल्टर मानदंड आपको वर्ग और मौजूदा संग्रह तत्वों के मौजूदा "जहां" विशेषता के समान प्रतिबंध खंड को परिभाषित करने की अनुमति देता है। हालांकि, ये फ़िल्टर स्थितियां पैरामीटरकृत हो सकती हैं। एप्लिकेशन तब रनटाइम पर निर्णय ले सकता है कि कुछ फ़िल्टर सक्षम किए जाने चाहिए और उनके पैरामीटर मान क्या होना चाहिए। फ़िल्टर का उपयोग डेटाबेस दृश्यों जैसे किया जा सकता है, लेकिन वे एप्लिकेशन के अंदर पैरामीटरकृत हैं।

उदाहरण

@Entity 
public class A implements Serializable{ 
    @Id 
    @Column(name = "REF") 
    private int ref; 

    @OneToMany 
    @JoinColumn(name = "A_REF", referencedColumnName = "REF") 
    @Filter(name="test") 
    private Set<B> bs; 
} 

@Entity 
@FilterDef(name="test", defaultCondition="other = 123") 
public class B implements Serializable{ 
    @Id 
    @Column(name = "A_REF") 
    private int aRef; 

    @Id 
    @Column(name = "OTHER") 
    private int other; 
} 

Session session = entityManager.unwrap(Session.class); 
session.enableFilter("test"); 
A a = entityManager.find(A.class, new Integer(0)) 
a.getb().size() //Only contains b that are equals to 123 
+0

धन्यवाद, यह अच्छी तरह से काम करता है। यह थोड़ा परेशान है हालांकि आपको इसे गतिशील रूप से सक्षम करना है (मैं इसे हमेशा सक्षम करूंगा)। मैं इसके साथ रहूंगा! – Xavier

+0

इकाई प्रबंधक पर कोई अपरिवर्तनीय विधि नहीं है :( –

+1

क्षमा करें, यह केवल जेपीए 2.0 के बाद उपलब्ध है। Http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager.html#unwrap(java.lang। कक्षा) –

0

जेपीए 1 के साथ आपके द्वारा दी गई समाधान लेकिन परिवर्तन खोलना getDelegate है कि

Session session = (Session)entityManager.getDelegate(); 

की तरह बनना उपयोग कर सकते हैं और यह काम करने के लिए जा रहा है।

@JoinColumns({ 
    @JoinColumn(name = "A_REF", referencedColumnName = "REF"), 
    @JoinColumn(name = "B_TABLE_NAME.OTHER", referencedColumnName = "'123'")}) 
@OneToMany 
private Set<B> bs; 

नोट:

0

मैं सवाल सही समझ रहा है, वहाँ javax.persistence एनोटेशन के साथ यह करने के लिए (मैं एक ManyToOne पर अपने आप को इस के लिए इस्तेमाल किया, और here से जवाब अनुरूप) एक तरीका है संदर्भित कॉलमनाम में एकल उद्धरण, यह वह मान है जिसे आप ढूंढ रहे हैं।

अधिक जानकारी here