জাভাতে কোনও ভাল গতিশীল এসকিউএল বিল্ডার লাইব্রেরি নেই? [বন্ধ]


108

স্কুইগলের মতো জাভাটির জন্য যে কোনও ভাল এসকিউএল বিল্ডার লাইব্রেরি জানেন ( সাধারণত, সক্রিয় বিকাশে একটি প্রকল্প।

সাধারণত জেনড_ডিবি_সিলেক্টের মতো সিনট্যাক্স সহ , এমন কিছু যা কোয়েরিকে পছন্দ করার অনুমতি দেয়

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

আমি কী জিজ্ঞাসা করতে পারি "SELECT f1..fn FROM পণ্য অর্ডার দ্বারা product_id" এর বিপরীতে উপরের সিনট্যাক্সটির সুবিধা কী?
Itay Moav -Malimovka

4
@ ItayMoav-Malimovka, ওয়েল, কমপক্ষে আমার ক্ষেত্রে এসকিউএল কোয়েরির বাক্য গঠনটি (যদি আমরা JOOQ কে উদাহরণ হিসাবে নিই) আপনার কোডটি লেখার সময় পরীক্ষা করা হয়। আপনার কাছে সম্পূর্ণ সিনট্যাক্স স্বয়ংসম্পূর্ণ রয়েছে যা আপনার ক্যোয়ারী-লেখার গতি বাড়ায় এবং এটিকে আরও ত্রুটি-প্রবণ করে তোলে।
ভ্লাদিস্লাভ রাস্ট্রুসনি

আমি একমত যে এটি আইডিইগুলির উন্নত হওয়া উচিত।
Itay Moav -Malimovka

1
@ ItayMoav-Malimovka, ভাল ... JOOQ এর ক্ষেত্রে, আমি যদি আমার ডিবি স্ট্রাকচারে কিছু পরিবর্তন করি তবে আমার কোডটি নতুন ডিবি কাঠামো অনুযায়ী এটি ঠিক না করা অবধি আমার সংকলন বন্ধ হয়ে যাবে। পাঠ্য হিসাবে আপনার যদি প্রশ্ন থাকে তবে সেগুলি ভাঙা যাবে।
ভ্লাদিস্লাভ রাস্ট্রুসনি

উদাহরণ হিসাবে: বর্তমানে আমি একটি অ্যাপ্লিকেশন নিয়ে কাজ করছি যা একটি বৃহত লিগ্যাসি ডাটাবেসে কাজ করার জন্য বিবৃতি তৈরি করতে হবে। অনেক বিবৃতি কাস্টম প্রতিবন্ধকতাগুলি শেয়ার করে যা আমরা একটি এসকিউএল ডিএসএল দ্বারা তৈরি করি। ধন্যবাদ যে আমরা সহজেই এমন বিবৃতি তৈরি করতে পারি যা সংকলনের সময় জানা যায় না।
রাফায়েল শীতকালীন

উত্তর:


53

ক্যুরিডসল এবং জোকিউ দুটি জনপ্রিয় পছন্দ।


6
JOOQ সম্ভবত হার্ড এসকিউএল বিকাশের জন্য আরও ভাল পছন্দ, তবে ক্যুরিডসেলের একটি সহজ এপিআই রয়েছে এবং এটি অন্যান্য ব্যাকেন্ডগুলিও সমর্থন করে (জেপিএ, জেডিও, লুসিন, মংডব ইত্যাদি); আমি কোয়েরিডসেলের পিছনে সংস্থায় আছি
টিমো ওয়েস্টক্যাম্পার

আমরা আমাদের কয়েকটি গৃহ প্রকল্পে কয়েরিএসএল এসকিউএল ব্যবহার করি। আমার কাছে জুকের ব্যক্তিগত অভিজ্ঞতা নেই তবে শুনেছি এটি বেশ ঠিক আছে।
পোনজাও

11
কোয়েরিডিএসএল সমস্যাটি হ'ল আপনি খাঁটি ক্যোয়ারী জেনারেটর হিসাবে এটি ব্যবহার করতে পারবেন না কারণ এটি আপনাকে উত্পন্ন উত্পন্ন ক্যোয়ারীটি দেয় না। এটি ক্যোয়ারী উত্পন্ন করবে এবং এটি আপনার জন্যও কার্যকর করবে। আপনি অন্য একজন ছাড়া পেতে পারেন না।
অভিনব সরকার

5
ক্যোয়ার্ড এসএল এবং জওকিউ সবচেয়ে জনপ্রিয় এবং পরিপক্ক পছন্দ বলে মনে হচ্ছে তবে একটি বিষয় সম্পর্কে সচেতন হওয়া উচিত: উভয়ই কোড জেনারেশনের ধারণার উপর নির্ভর করে, যেখানে মেটা ক্লাসগুলি ডেটাবেস টেবিল এবং ক্ষেত্রগুলির জন্য উত্পন্ন হয়। এটি একটি দুর্দান্ত, পরিষ্কার ডিএসএলকে সহায়তা করে তবে উপরের ওপি-র উদাহরণের মতো কেবল রানটাইম হিসাবে পরিচিত ডেটাবেসগুলির জন্য অনুসন্ধান তৈরি করার চেষ্টা করার সময় এটি একটি সমস্যার মুখোমুখি হয়। যখন JOOQ স্ট্রিং ভিত্তিক অ্যাপ্রোচকে সমর্থন করে তবে সেখানে কিছু তর্ক রয়েছে। ক্যুরিডসল এর ডকুমেন্টেশন কোড জেনারেশন ব্যবহার না করা সম্ভব কিনা তা উল্লেখ করে না। আমি ভুল হলে আমাকে সংশোধন করুন।
সোভেন জ্যাকবস

3
খুব পুরানো মন্তব্য @SvenJacobs কিন্তু আপডেট করতে, QueryDSL কোড নির্মাণ ছাড়া SQL বিল্ডিং অনুমতি দেয়: stackoverflow.com/questions/21615956/...
নাগরাজ Tantri

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 সুপারিশ করতে পারেন । এটি প্রচুর দুর্দান্ত বৈশিষ্ট্যগুলি সরবরাহ করে, এসকিউএল এর জন্য একটি স্বজ্ঞাত ডিএসএল এবং একটি চূড়ান্তভাবে স্বনির্ধারিত বিপরীত ইঞ্জিনিয়ারিং পদ্ধতিরও।

jOOQ কার্যকরভাবে সাবলীল, স্বজ্ঞাত ডিএসএলে জটিল এসকিউএল, টাইপসফাইটি, উত্স কোড উত্পন্নকরণ, সক্রিয় রেকর্ডস, সঞ্চিত পদ্ধতি, উন্নত ডেটা প্রকার এবং জাভাকে কার্যকরভাবে সংযুক্ত করে।


আপনি এটি ব্যবহার করেন? তুমি এটা কিভাবে পেলে?
ভ্লাদিস্লাভ রাস্ট্রুসনি

3
আমি এটি ডিডিএল থেকে কাস্টম উত্স কোড উত্পন্ন করতে ব্যবহার করি। এটি দুর্দান্ত কাজ করছে!
ক্রিস্টোফার ক্লেওস

"যদিও এসকিউএল স্টেটমেন্টগুলি তৈরি করার জন্য জোকিউ লাইব্রেরিতে দুর্দান্ত একটি এপিআই রয়েছে, তবে এটি স্ট্যান্ডার্ডগুলির সাথে স্টেটমেন্ট তৈরি করতে, ডাটাবেসে সংযোগ স্থাপন করতে, ডিজিটালগুলিতে / থেকে মডেলগুলি লিখতে / পড়তে ইত্যাদির সাথে আসে, বর্তমান অ্যান্ড্রয়েড অ্যাপ্লিকেশন ভিএম এর প্রকৃতির কারণে , একটি k৪ কে পদ্ধতির রেফারেন্স সীমা রয়েছে। jOOQ ব্যবহারের সময় 10,000 এর বেশি রেফারেন্সড পদ্ধতি থাকতে পারে the সীমাটির তুলনায় এটি খুব বেশি না মনে হতে পারে তবে আপনি যদি সাধারণত ব্যবহৃত অন্যান্য বড় লাইব্রেরি বিবেচনা করেন (যেমন পেয়ারা এবং গুগল প্লে পরিষেবাদি) , যে 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
সমস্যাটি হ'ল এটি বুঝে এসকিউএল এ ম্যাপ করে না, তাই না?
ভ্লাদিস্লাভ রাস্ট্রুসনি

7
এটি এসকিউএল জেনারেট করে না এবং এটি কমপক্ষে বিস্ময়ের নিয়মটি অনুসরণ না করে (প্রত্যাশার মতো কাজ করে না) ডিবাগ করার জন্য একটি দুঃস্বপ্ন

এটি এসকিউএল তৈরি করে (শেষে) এবং এটি কাউকে অবাক করে না। উপকার - এটি ডাটাবেস জুড়ে পোর্টেবল।
ভ্লাদিমির ডিউজেভ

3
কোয়েরিটি পুরোপুরি অপঠনযোগ্য না করে, আপনি জেপিএ ক্রিটারিয়া এপিআই-তে পৌঁছতে যে কোয়েরি জটিলতার স্তর অর্জন করেছেন তা কী? আপনি যদি একটি একটি উদাহরণ একটি ইন নির্বাচন নেস্টেড আছে IN/ EXISTSজন্য একটি স্ব-যোগ ব্যবহার alias লেখা ধারা, অথবা Saleসত্তা, ইত্যাদি? আমি কৌতূহলী
লুকাশ এদার

1
মন্তব্যগুলি উদাহরণ প্রদানের জন্য খুব বেশি জায়গা দেয় না, তবে ডকস.জবোস.আর
ভ্লাদিমির দিউজেভ

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")));

এটি কেবল হাতে এসকিউএল লেখার চেয়ে আরও জটিল
এপিকপ্যান্ডফোর্স

@ এপিকপান্ডা ফোরস আমি খুব সাধারণ ক্ষেত্রে সম্মত হই তবে যখন এই শর্তটির আলাদা সেট রয়েছে তখন খুব জটিল অবস্থার উপর ভিত্তি করে আপনার যখন স্ট্রিংটি যুক্ত করতে হবে তখন কনকনেটেশন অনেক জটিল। সঠিকভাবে সংক্ষিপ্ত স্ট্রিং (যেমন সমস্ত সংযোজন, যোগদান, পরামিতি সেট ইত্যাদি) ব্যথা। সমাধানের সাথে আপনার একজন বিল্ডার রয়েছে যা আপনার জন্য এই জটিলতা মোকাবেলা করবে।
প্রেজেক নওক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.