क्या जावा में कोई अच्छा गतिशील SQL बिल्डर पुस्तकालय है? [बन्द है]


108

किसी को जावा के लिए कुछ अच्छा SQL बिल्डर लाइब्रेरी पता है जैसे कि स्क्वीगल (अब ऐसा नहीं लगता है)। अधिमानतः, सक्रिय विकास में एक परियोजना।

अधिमानतः सिंटैक्स जैसे Zend_Db_Select के साथ , कुछ ऐसा जो क्वेरी बनाने की अनुमति देगा

String query = db.select().from('products').order('product_id');

क्या मैं यह पूछ सकता हूं कि "SELECT f1..fn FROM products ORDER BY product_id" के खिलाफ वाक्य रचना का क्या फायदा है?
इते मूव -मालिमोवका

4
@ ItayMoav-Malimovka, खैर, कम से कम मेरे मामले में SQL क्वेरी का सिंटैक्स (यदि हम एक उदाहरण के रूप में JOOQ लेते हैं) तो आपके द्वारा कोड लिखने के समय जांच की जाती है। आपके पास पूर्ण सिंटैक्स स्वत: पूर्ण है जो आपके क्वेरी-लेखन को गति देता है और इसे अधिक त्रुटि-प्रवण बनाता है।
व्लादिस्लाव रैस्ट्रुसनी

मैं मानता हूं कि यह कुछ ऐसा है जिस पर आईडीई को सुधार करना चाहिए।
इटाए मोव -मालिमोवका

1
@ ItayMoav-Malimovka, अच्छी तरह से ... JOOQ के मामले में, अगर मैं अपने DB संरचना में कुछ बदलता हूं, तो मेरा कोड बस संकलन करना बंद कर देगा जब तक कि मैं इसे नए DB संरचना के अनुसार ठीक नहीं करता। यदि आपके पास पाठ के रूप में प्रश्न हैं, तो वे टूटे हुए छोड़ देंगे।
व्लादिस्लाव रैस्ट्रासनी

एक उदाहरण के रूप में: मैं वर्तमान में एक ऐसे अनुप्रयोग पर काम कर रहा हूं जिसमें एक विशाल विरासत डेटाबेस पर काम करने के लिए वक्तव्य बनाने की आवश्यकता है। कई बयान कस्टम बाधाओं को साझा करते हैं जो हम एक SQL डीएसएल द्वारा बनाते हैं। इसके लिए धन्यवाद कि हम आसानी से बयान दे सकते हैं जो संकलन समय पर ज्ञात नहीं हैं।
राफेल विंटरथेलर

जवाबों:


54

Querydsl और jOOQ दो लोकप्रिय विकल्प हैं।


6
JOOQ कट्टर SQL विकास के लिए एक बेहतर विकल्प है, लेकिन Querydsl में एक सरल API है और अन्य बैकएंड (JPA, JDO, Lucene, Mongodb आदि) का भी समर्थन करता है; मैं Querydsl
Timo Westkämper

हम अपने कुछ प्रोजेक्ट्स में Querydsl SQL का इस्तेमाल करते हैं। मुझे jooq का कोई व्यक्तिगत अनुभव नहीं है लेकिन मैंने सुना है कि यह काफी ठीक है।
पोन्जाओ

11
QueryDsl के साथ समस्या यह है कि आप इसका उपयोग शुद्ध क्वेरी जनरेटर के रूप में नहीं कर सकते क्योंकि यह आपको स्वयं उत्पन्न क्वेरी नहीं देता है। यह क्वेरी उत्पन्न करेगा और इसे आपके लिए भी निष्पादित करेगा। आप एक दूसरे के बिना नहीं मिल सकता है।
अभिनव सरकार

5
Querydsl और jOOQ सबसे लोकप्रिय और परिपक्व विकल्प प्रतीत होते हैं, हालांकि इसके बारे में एक बात का पता होना चाहिए: दोनों कोड पीढ़ी की अवधारणा पर भरोसा करते हैं, जहां डेटाबेस टेबल और फ़ील्ड के लिए मेटा कक्षाएं उत्पन्न होती हैं। यह एक अच्छा, साफ डीएसएल की सुविधा देता है, लेकिन यह एक समस्या का सामना करता है जब डेटाबेस के लिए प्रश्न बनाने की कोशिश की जाती है, जो केवल रनटाइम पर ज्ञात होते हैं, जैसे कि ओपी के उदाहरण में। जबकि jOOQ एक स्ट्रिंग आधारित दृष्टिकोण का समर्थन करता है जिसमें कुछ विचित्रताएँ हैं। Querydsl के दस्तावेज़ीकरण में यह उल्लेख नहीं है कि क्या कोड पीढ़ी का उपयोग नहीं करना संभव है। कृपया मुझे सुधारें अगर मैं गलत हूं।
स्वेन जैकब्स

3
@SvenJacobs बहुत पुरानी टिप्पणी, लेकिन अपडेट करने के लिए, QueryDSL कोड पीढ़ी के बिना sql बनाने की अनुमति देता है: stackoverflow.com/questions/21615956/…
नागराज तंत्री

7

ddlutils मेरी सबसे अच्छी पसंद है: http://db.apache.org/ddlutils/api/org/apache/ddlutils/platform/SqlBuilder.html

यहाँ उदाहरण (ग्रूवी) बनाएँ:

Platform platform  = PlatformFactory.createNewPlatformInstance("oracle");//db2,...
//create schema    
def db =        new Database();
def t = new Table(name:"t1",description:"XXX");
def col1 = new Column(primaryKey:true,name:"id",type:"bigint",required:true);
t.addColumn(col1);
t.addColumn(new Column(name:"c2",type:"DECIMAL",size:"8,2"));
t.addColumn( new Column(name:"c3",type:"varchar"));
t.addColumn(new Column(name:"c4",type:"TIMESTAMP",description:"date"));        
db.addTable(t);
println platform.getCreateModelSql(db, false, false)

//you can read Table Object from  platform.readModelFromDatabase(....)
def sqlbuilder = platform.getSqlBuilder();
println "insert:"+sqlbuilder.getInsertSql(t,["id":1,c2:3],false);
println "update:"+sqlbuilder.getUpdateSql(t,["id":1,c2:3],false);
println "delete:"+sqlbuilder.getDeleteSql(t,["id":1,c2:3],false);
//http://db.apache.org/ddlutils/database-support.html

1
मुझे कॉलम को फिर से परिभाषित करना है, हालांकि मैंने पहले ही उन्हें @Entity में परिभाषित किया है, इसलिए दर्द।
हुतांग

6

मैं jOOQ की सिफारिश कर सकता हूं । यह बहुत सी शानदार सुविधाएँ प्रदान करता है, SQL के लिए एक सहज ज्ञान युक्त डीएसएल और एक चरम रूप से कस्टमाइज़ करने वाला रिवर्स-इंजीनियरिंग दृष्टिकोण भी।

jOOQ प्रभावी ढंग से जटिल एसक्यूएल, टाइपसिटी, सोर्स कोड जेनरेशन, सक्रिय रिकॉर्ड, संग्रहीत कार्यविधियाँ, उन्नत डेटा प्रकार और जावा को एक धाराप्रवाह, सहज ज्ञान युक्त डीएसएल में जोड़ती है।


क्या तुम इसका इस्तेमाल करते हो? ये तुम्हें कैसे मिला?
व्लादिस्लाव रैस्ट्रुसनी

3
मैं इसका इस्तेमाल DDL से कस्टम सोर्स कोड जेनरेट करने के लिए करता हूं। यह बहुत अच्छा काम कर रहा है!
क्रिस्टोफर क्लेवेस 7

"हालांकि, jOOQ लाइब्रेरी में SQL स्टेटमेंट्स के निर्माण के लिए एक बहुत अच्छा API है, यह स्टेटमेंट्स बनाने, डेटाबेस से जुड़ने, लिखने / पढ़ने / मॉडल करने / डेटाबेस से / करने के लिए टूल के पूरे सूट के साथ आता है। एंड्रॉइड एप्लिकेशन की वर्तमान प्रकृति के कारण VM वहाँ एक 64k विधि संदर्भ सीमा है। jOOQ में 10,000 से अधिक संदर्भित विधियाँ शामिल हो सकती हैं जब उपयोग में हो। यह सीमा की तुलना में बहुत अधिक नहीं लग सकता है, लेकिन यदि आप आमतौर पर उपयोग की जाने वाली अन्य बड़ी पुस्तकालयों पर विचार करते हैं (जैसे कि अमरूद और Google Play सेवाएं) , मारना कि 64k सीमा बहुत आसान हो जाता है। - android-arsenal.com/details/1/3202 :(
टॉम फीजफर

3

हाइबरनेट मानदंड एपीआई (सादा एसक्यूएल नहीं है, लेकिन बहुत शक्तिशाली और सक्रिय विकास में):

List sales = session.createCriteria(Sale.class)
         .add(Expression.ge("date",startDate);
         .add(Expression.le("date",endDate);
         .addOrder( Order.asc("date") )
         .setFirstResult(0)
         .setMaxResults(10)
         .list();

1
समस्या यह है कि यह SQL को मैप नहीं करता है जैसा कि मैं समझता हूं, ठीक है?
व्लादिस्लाव रैस्ट्रुसनी

7
जब यह कम से कम विस्मय के नियम का पालन नहीं करता है (उम्मीद के

यह एसक्यूएल (अंत में) उत्पन्न करता है और यह कोई भी आश्चर्य नहीं करता है। लाभ - यह डेटाबेस में पोर्टेबल है।
व्लादिमीर Dyuzhev

3
क्वेरी की जटिलता का वह स्तर जो आपने क्वेरी को पूरी तरह से बिना पढ़े बिना जेपीए मानदंड एपीआई के साथ प्राप्त करने के लिए हासिल किया है? क्या आपके पास एक नेस्टेड सेलेक्ट का उदाहरण है IN/ EXISTSक्लॉज़ में, या Saleइकाई के लिए उपनाम का उपयोग करते हुए सेल्फ-ज्वाइन करें ? मैं जिज्ञासु हूं
लुकास ईडर

1
टिप्पणियां उदाहरण प्रदान करने के लिए बहुत जगह नहीं देती हैं, लेकिन आप उनका docs.jboss.org/hibernate/core/3.5/reference/en/html/…
व्लादिमीर Dyuzhev

0

आप निम्नलिखित पुस्तकालय का उपयोग कर सकते हैं:

https://github.com/pnowy/NativeCriteria

लाइब्रेरी हाइबरनेट "क्राइस्ट साइकल क्वेरी" के शीर्ष पर बनी है, इसलिए यह हाइबरनेट द्वारा समर्थित सभी डेटाबेस (हाइबरनेट सत्र और जेपीए प्रदाता समर्थित हैं) का समर्थन करता है। बिल्डर संरक्षक उपलब्ध है और इसी तरह (ऑब्जेक्ट मैपर्स, परिणाम मैपर्स)।

आप जीथब पृष्ठ पर उदाहरण पा सकते हैं, पुस्तकालय निश्चित रूप से मेवेन केंद्रीय पर उपलब्ध है।

NativeCriteria c = new NativeCriteria(new HibernateQueryProvider(hibernateSession), "table_name", "alias");
c.addJoin(NativeExps.innerJoin("table_name_to_join", "alias2", "alias.left_column", "alias2.right_column"));
c.setProjection(NativeExps.projection().addProjection(Lists.newArrayList("alias.table_column","alias2.table_column")));

यह सिर्फ हाथ से एसक्यूएल लिखने की तुलना में अधिक जटिल है
एपिकपांडाफायर

@EpicPandaForce मैं बहुत ही सरल मामलों के लिए सहमत हूं, लेकिन जब आप इस स्थिति का एक अलग सेट है, तो बहुत जटिल परिस्थितियों के आधार पर उस स्ट्रिंग को समतल करने की आवश्यकता है, लेकिन संघनन बहुत जटिल है। सही ढंग से सुधारा गया स्ट्रिंग तब (जैसे सभी जोड़, जोड़, होने, पैरामीटर सेट आदि) एक दर्द है। समाधान के साथ आपके पास एक बिल्डर है जो आपके लिए इस जटिलता से निपटेगा।
प्रेज़ेमेक नाऊक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.