2012-04-25 10 views
11

के दौरान एक जेपीए इकाई की एक क्षणिक विशेषता आरंभ करना मुझे आश्चर्य है कि किसी मानदंड क्वेरी के दौरान किसी इकाई की क्षणिक विशेषता प्रारंभ करना संभव है या नहीं।CriteriaQuery

उदाहरण

@Entity 
public SampleEntity{ 

    @Id 
    private long id; 

    [more attributes] 

    @Transient 
    private String someTransientString; 

    [getters and setters] 
} 

अब मैं एक CriteriaQuery कि सभी SampleEntity रों लोड करता रचना करना चाहते हैं और स्वचालित रूप से imamightlyfinestring को someTransientString सेट। मेरे मन में निम्नलिखित एसक्यूएल की तरह कुछ है:

SELECT ID AS ID, [..], 'imamightilyfinestring' AS SOME_TRANSIENT_STRING FROM SAMPLE_ENTITY 

निश्चित रूप से मुझे पता है कि मैं बस जिसके परिणामस्वरूप संग्रह पुनरावृति कर सकते हैं और मैन्युअल रूप से विशेषता सेट है, लेकिन अगर वहाँ JPA2 भीतर यह करने के लिए एक रास्ता है मैं सोच रहा हूँ ।

धन्यवाद :)

उत्तर

11

नहीं, आप इसे क्वेरी में नहीं कर सकते हैं।

आप क्वेरी के बाहर someTransientString के लिए मूल्य पता लगा सकते हैं, तो आप (जेपीए 2.0 विनिर्देश से अंश) PostLoad कॉलबैक का उपयोग कर सकते हैं:

एक इकाई के लिए PostLoad विधि इकाई के बाद शुरू हो जाती है लोड किया गया है डेटाबेस से वर्तमान दृढ़ता संदर्भ में या के बाद रीफ्रेश ऑपरेशन लागू किया गया है। पोस्टलोड लोड एक क्वेरी परिणाम लौटाए जाने या पहुंचने से पहले या एसोसिएशन को पार करने से पहले लागू किया गया है।

बस अपने संस्था के लिए निम्नलिखित जोड़ें:

@PostLoad 
protected void initSomeTransientString() { 
    //Likely some more complex logic to figure out value, 
    //if it is this simple, just set it directly in field declaration. 
    someTransientString = "imamightilyfinestring"; 
} 
+0

धन्यवाद, मैं के रूप में ज्यादा लगा। – ftr

0

तुम भी डिफ़ॉल्ट (यानी, कोई तर्क) निर्माता में अपने यात्रियों को प्रारंभ कर सकते हैं।

आप देख सकते हैं कि इस रणनीति का प्रयोग किया, उदाहरण के लिए EclipseLink में, (नीचे दिए गए लिंक में पिछले टिप्पणी पढ़ने के लिए) है:

https://bugs.eclipse.org/bugs/show_bug.cgi?id=292385

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

  • कोई संबंधित समस्या नहीं^_^