2010-05-28 8 views
5

मैं सिर्फ ग्लासफ़िश 3 (पर्सिस्टेंस प्रदाता EclipseLink) पर चल रहे एक साधारण जावा वेब ऐप में जेपीए के साथ पकड़ने जा रहा हूं। अब तक, मैं वास्तव में इसे पसंद कर रहा हूं (नेटबीन्स/ग्लासफ़िश इंटरैक्शन में बग्स) लेकिन एक ऐसी चीज है जिसे मैं ऐसा करने में सक्षम होना चाहता हूं, मुझे यकीन नहीं है कि कैसे करना है।जेपीए - गणना वर्ग से इकाई वर्ग संपत्ति सेट करना?

मुझे एक इकाई वर्ग (आलेख) मिला है जो डेटाबेस तालिका (आलेख) में मैप किया गया है। मैं डेटाबेस पर एक क्वेरी करने की कोशिश कर रहा हूं जो एक गणना कॉलम लौटाता है, लेकिन मैं यह नहीं समझ सकता कि अनुच्छेद वर्ग की संपत्ति कैसे स्थापित करें ताकि जब मैं क्वेरी को कॉल करता हूं तो संपत्ति कॉलम मान से भर जाती है।

यदि मैं एक नियमित "आईडी, शीर्षक, लेख से शरीर" क्वेरी करता हूं, तो मुझे आईडी, शीर्षक और शरीर गुणों के साथ आलेख ऑब्जेक्ट्स की सूची मिलती है। यह ठीक काम करता है।

हालांकि, अगर मैं नीचे कार्य करें:

Query q = em.createNativeQuery("select id,title,shorttitle,datestamp,body,true as published, ts_headline(body,q,'ShortWord=0') as headline, type from articles,to_tsquery('english',?) as q where idxfti @@ q order by ts_rank(idxfti,q) desc",Article.class); 

(यह एक प्रतिलिपि प्राप्त खोज पर Postgres tsearch2 उपयोग कर रहा है - यह एक डाटाबेस-विशेष समारोह है, तो मैं एक NativeQuery उपयोग कर रहा हूँ)

आप देख सकते हैं कि मैं एक गणना कॉलम ला रहा हूं, जिसे शीर्षक कहा जाता है। मैं अपने अनुच्छेद वर्ग में एक शीर्षक संपत्ति कैसे जोड़ूं ताकि यह इस क्वेरी द्वारा पॉप्युलेट हो जाए?

अभी तक, मैंने इसे @ ट्रांसिएंट होने की कोशिश करने की कोशिश की है, लेकिन यह हर समय शून्य होने के साथ समाप्त होता है।

उत्तर

7

शायद यह करने के लिए कोई अच्छा तरीके हैं, केवल मैन्युअल:

Object[] r = (Object[]) em.createNativeQuery(
    "select id,title,shorttitle,datestamp,body,true as published, ts_headline(body,q,'ShortWord=0') as headline, type from articles,to_tsquery('english',?) as q where idxfti @@ q order by ts_rank(idxfti,q) desc","ArticleWithHeadline") 
    .setParameter(...).getSingleResult(); 

Article a = (Article) r[0]; 
a.setHeadline((String) r[1]); 

-

@Entity 
@SqlResultSetMapping(
    name = "ArticleWithHeadline", 
    entities = @EntityResult(entityClass = Article.class), 
    columns = @ColumnResult(name = "HEADLINE")) 
public class Article { 
    @Transient 
    private String headline; 
    ... 
} 
2

AFAIK, जेपीए गणना की विशेषताओं के लिए मानकीकृत समर्थन की पेशकश नहीं करता है। हाइबरनेट के साथ, कोई Formula का उपयोग करेगा लेकिन एक्लिप्ससेंक का प्रत्यक्ष समतुल्य नहीं है। जेम्स सदरलैंड हालांकि Re: Virtual columns (@Formula of Hibernate) में कुछ सुझाव दिए:

कोई प्रत्यक्ष समकक्ष (कृपया लॉग बढ़ा हुआ) है, लेकिन पर कि आप क्या करना चाहते हैं निर्भर करता है, वहाँ के तरीके हैं इसी कार्य को पूरा।

EclipseLink एक TransformationMapping जो कई क्षेत्र मूल्यों से एक अभिकलन मूल्य मैप कर सकते हैं, या डेटाबेस का उपयोग को परिभाषित करता है।

आप अपने डिस्क्रिप्टर के DescriptorQueryManager का उपयोग कर किसी भी CRUD ऑपरेशन के लिए SQL को ओवरराइड कर सकते हैं।

आप अपने डेटाबेस है कि समारोह करता है पर एक दृश्य को परिभाषित करने और देखने बजाय मेज पर अपने इकाई मैप कर सकते।

आप कन्वर्टर्स या संपत्ति प्राप्त/सेट विधियों का उपयोग करके नाबालिग अनुवाद भी कर सकते हैं।

इसके अलावा enhancement request एक समाधान टिप्पणी में एक DescriptorEventListener का उपयोग कर है पर एक नजर है।

यह सब गैर मानक जेपीए है।

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

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