2012-04-12 17 views
5

के लिए अधिक उपयोग करने योग्य विकल्प this answer में वर्णित अनुसार जेपीक्यूएल या कच्चे एसक्यूएल का उपयोग करने पर कुछ फायदे हैं: सुरक्षा टाइप करें; मित्रता को दोबारा प्रतिक्रिया देना; तारों पर कम निर्भरता (लेकिन अभी भी कुछ है)। और एक बहुत बड़ा नुकसान: वे कम पठनीय और आसानी से बदसूरत हैं। क्या संबंधपरक डेटाबेस तक पहुंचने के लिए एक (गैर-जेपीए) जावा एपीआई है जो टाइपएफ़ और पठनीय दोनों है?मानदंड एपीआई

+3

[एक और पढ़ सुझाव] (http://stackoverflow.com/q/825141/248082) – nobeh

उत्तर

6

Timo Westkämper ने QueryDSL के साथ अच्छा काम किया है। यह लाइब्रेरी विभिन्न दृढ़ता प्रदाताओं (जेपीए, मोंगोडीबी, लुसीन ...) से पूछताछ के लिए एक डीएसएल प्रदान करती है।

लेकिन मैंने अक्सर हाथ से बने समाधानों का उपयोग किया है जो सबसे आम प्रश्नों को सरल बनाता है (अपने कुछ क्षेत्रों को प्रतिबंधित करने वाली इकाई सूचीबद्ध करता है), मुझे हमेशा एक ही पंक्ति लिखने से रोकता है। सबसे जटिल प्रश्नों के लिए मैंने अपठनीय और वर्बोज़ मानदंड API पर स्विच किया।

2

MyBatis.

MyBatis कस्टम एसक्यूएल, संग्रहित प्रक्रियाओं और उन्नत मैपिंग के लिए समर्थन के साथ एक प्रथम श्रेणी के हठ रूपरेखा है। MyBatis लगभग सभी जेडीबीसी कोड और पैरामीटर की मैन्युअल सेटिंग और परिणामों की पुनर्प्राप्ति को समाप्त करता है। MyBatis डेटाबेस रिकॉर्ड्स में कॉन्फ़िगरेशन और मैप प्राइमेटिव्स, मैप इंटरफेस और जावा पीओजेओ (सादा ओल्ड जावा ऑब्जेक्ट्स) के लिए सरल एक्सएमएल या एनोटेशन का उपयोग कर सकते हैं।

या, nobeh suggested के रूप में: jOOQ

+2

इस संबंध में, आप [jOOQ] (http://www.jooq.org/) या [JDBI] (http://www.jdbi.org/) पर भी एक नज़र डालना चाहेंगे। – nobeh

+0

jOOQ, हाँ; जेडीबीआई, नहीं - जेडीबीआई के पास अपारदर्शी तारों पर समान निर्भरता है जो जेपीक्यूएल करता है। –

0

मैं पाया है निम्नलिखित उपयोगिता वर्ग के चेहरे पर एक आसान जेपीए खोज करने के लिए "परम" समाधान: DynamicQueryBuilder

  1. यह मेटा मॉडल देता है, तो आप जुड़ जाता है का उपयोग कर संबंधों का वर्णन करने के जरूरत नहीं होगी ।

  2. यह टेम्पलेट pojo द्वारा खोज !!! बस मानों को एक इकाई उदाहरण में रखें और उनका उपयोग मानदंड के रूप में किया जाएगा!

  3. यह निर्माता पैटर्न का उपयोग करता है, इसलिए यह बहुत पठनीय है!

    बैंक बैंक = नया बैंक(); bank.setId (12 एल); bank.setAchCode ("1213"); bank.setCbeCode ("1234"); bank.setStatus (नए लुकअप (1 एल)); bank.setAchShortName ("121");

    सूची ids = नया ArrayList(); ids.add (1); ids.add (2); ids.add (3); ids.add (4); ids.add (5);

    सूची cbeCodes = new ArrayList(); cbeCodes.add ("1111"); cbeCodes.add ("2222");

    डायनामिकQueryबिल्डर क्वेरी DyncBuilder1 = नया डायनामिकQueryबिल्डर। बिल्डर (शून्य)। चयन (बैंक) .withOperType (Operator.OperType.AND)। withAdvancedParam ("cbeCode", की तरह, PERCENT_AROUND) .withAdvancedParam ("आईडी", में, आईडी) .withAdvancedParam ("achCode", बीच, cbeCodes) .withAdvancedParam ("achShortName", जी.टी.) .orderBy ("आईडी") .orderBy ("cbeCode", सत्य) .orderBy ("status.code", true) .build();

    System.out.println (queryDyncBuilder1।getQueryString());

आप ऊपर कॉल घटक निम्न का निर्माण करेगी JPQL क्वेरी परिणामस्वरूप चलाते हैं:

SELECT b 
FROM Bank b 
WHERE b.status = :status 
AND b.cbeCode LIKE :cbeCode 
AND b.achShortName > :achShortName 
AND b.id IN :id 
AND (b.achCode BETWEEN :achCodeFrom AND :achCodeTo) 
ORDER BY b.status.code DESC, b.id ASC, b.cbeCode DESC 
+0

"यह बिल्डर पैटर्न का उपयोग करता है, इसलिए यह बहुत पठनीय है" मुझे इस संबंध में QueryDSL बहुत कुछ पसंद है। –

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