2012-05-11 34 views
5

मेरे पास डेटाबेस में दो Integer कॉलम हैं (डर्बी और डीबी 2)। मुझे उन्हें एक दूसरे के साथ JPQL के अंदर विभाजित करने की आवश्यकता है।मैं एक जेपीक्यूएल कथन के अंदर टाइपकास्टिंग का उपयोग कैसे कर सकता हूं?

दोनों कॉलम Integer प्रकार शून्य हैं यदि शेष दशमलव संख्या है तो 0.250 आदि हो जाता है और समझ में आता है क्योंकि टाइप int है।

SQL में मैं उदाहरण

select CAST(column1 as decimal(6,2))/CAST(column2 as decimal(6,2))from Sometable;

के लिए इस हो सकता था लेकिन JPQL बराबर क्या है।

एक विकल्प हो सकता है (मैं अभी तक प्रयास नहीं किया है) इकाई में एक @Transient विधि दशमलव प्रकार लौटने और वहाँ इस गणना कर रहे हैं और JPQL है कि पारित करने के लिए है, लेकिन मैं नहीं बल्कि SQL यह काम करते हैं जाएगा।


माइस्क्ल को डेटाबेस स्तर पर कास्टिंग की आवश्यकता नहीं है। इसलिए विभिन्न आरडीबीएमएस के लिए व्यवहार अलग है जो ठीक है। लेकिन जेपीक्यूएल को यह जानने के लिए देशी क्वेरी का उपयोग करने की ज़रूरत है कि इस ऑपरेशन के लिए दशमलव पर कास्ट की आवश्यकता है।

बोली को जोड़ने <property name="openjpa.jdbc.DBDictionary" value="derby"/> ने इसे ठीक नहीं किया।

कृपया ध्यान दें यह JPA1

उत्तर

2

आप मूल रूप से तीन विकल्प हैं।

  1. पोस्टलोड का उपयोग करें और जावा इसे करने दें।
  2. एक तृतीय श्रेणी का उपयोग करें और निर्माता कॉल करने के लिए JPQL के बयान का चयन में नई ऑपरेटर का उपयोग करें और अंदर है कि कॉल आप डेटाटाइप्स जो एसक्यूएल को दे दिया जाएगा प्रबंधन कर सकते हैं, लेकिन आप वस्तुओं की एक से अधिक तरह वापस आ गया है जो मिल जाएगा ठीक है बस सही सरणी अनुक्रमणिका से सही प्राप्त करें। इस here पर अधिक।
  3. तीसरा उपयोग इडानोमो जैसी मूल क्वेरी ने कहा।
2

है AFAIK वहाँ JPQL में डाली इस तरह इसके लिए कोई तरीका नहीं है।

मैं जेपीए के मूल क्वेरी निष्पादन का उपयोग करने का सुझाव देता हूं जो आपको एक SQL क्वेरी चलाने देता है जैसे आप जेडीबीसी का उपयोग कर रहे थे।

उदाहरण के लिए:

Query query = em.createNativeQuery("select CAST(column1 as decimal(6,2))/CAST(column2 as decimal(6,2)) from Sometable"); 

Double result = (Double) query.getSingleResult(); 

या

List<Double> results = (List<Double>) query.getResultList(); 
+0

मुझे उम्मीद है कि div/ऑपरेटर को कास्ट की आवश्यकता के बिना दशमलव वापस करने की उम्मीद होगी, लेकिन ऐसा नहीं हो रहा है। बोली लगाने की व्यवस्था भी करनी चाहिए/इस पर ध्यान रखना चाहिए, लेकिन मामला भी नहीं। मैं देशीQuery की तरफ झुका रहा हूं लेकिन मुझे अभी भी विश्वास नहीं है कि यह केवल विकल्प नहीं है। यदि यह वास्तव में दुख की तरह है। +1। – Shahzeb

+0

क्या आप विस्तार से बता सकते हैं कि आप डायलेक्ट को स्वचालित रूप से कास्टिंग करने की अपेक्षा क्यों करते हैं? – Victor

+0

@ कौशिक क्योंकि दो पूर्णांकों का विभाजन अंतर्निहित डेटाबेस के आधार पर एक अलग डेटाटाइप उत्पन्न करता है। उदाहरण के लिए 'माइस्क्ल' एक दशमलव देता है जहां 'डर्बी' और' डीबी 2 'पूर्णांक होता है जो उदाहरण के लिए '0.25' से' 0' बदलता है। वहां पूर्व बोली को व्यवहार को जानना चाहिए और एक मशीन प्रदान करना चाहिए विशेष रूप से दिया गया है कि एक कास्ट का विकल्प 'जेपीक्यूएल' में उपलब्ध नहीं है। – Shahzeb

3

विभाजन ऑपरेटर पूर्णांक तर्क पर पूर्णांक विभाजन करता है यही कारण है कि एक विशेषता है। MySQL में आपको फ्लोरिंग पॉइंट डिवीजन के लिए पूर्णांक विभाजन और / के लिए स्पष्ट रूप से div चुनना होगा, जबकि जेपीक्यूएल में पसंद जावा में ही स्वचालित रूप से किया जाएगा।

तो मेरा सुझाव है:

select (column1 * 1.0)/column2 from Sometable;