Чи є якась хороша динамічна бібліотека SQL Builder на Java? [зачинено]


108

Хтось знає хорошу бібліотеку SQL Builder для Java, як Squiggle (більше не підтримується, здається). Переважно, проект в активному розвитку.

Переважно з синтаксисом типу Zend_Db_Select , що дозволить зробити запит на зразок

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

Чи можу я запитати, у чому полягає перевага синтаксису вище щодо "SELECT f1..fn FROM products ORDER BY product_id"?
Itay Moav -Malimovka

4
@ ItayMoav-Malimovka, Ну, принаймні синтаксис SQL-запиту в моєму випадку (якщо взяти JOOQ як приклад) перевіряється під час написання коду. У вас є повноцінне автозаповнення синтаксису, яке прискорює написання запитів і робить його більш схильним до помилок.
Владислав Раструсний

Я погоджуюсь, що це те, що IDE має покращитися.
Itay Moav -Malimovka

1
@ ItayMoav-Malimovka, ну ... у випадку JOOQ, якщо я щось зміню в своїй структурі БД, мій код просто припинить компілювати, поки я не виправлю його відповідно до нової структури БД. Якщо у вас є запити як текст, вони залишаться зламаними.
Владислав Раструсний

Як приклад: я зараз працюю над додатком, який повинен створити заяви для роботи над масовою застарілою базою даних. Багато висловлювань поділяють власні обмеження, які ми будуємо за допомогою SQL DSL. Завдяки цьому ми можемо легко створювати заяви, які не відомі під час компіляції.
Рафаель Вінтерхалтер

Відповіді:


54

Querydsl та jOOQ - це два популярні варіанти.


6
JOOQ - це, мабуть, кращий вибір для жорсткої розробки SQL, але Querydsl має більш простий API та підтримує також інші програмні засоби (JPA, JDO, Lucene, Mongodb тощо); Я також в компанії за Querydsl
Тімо Весткампер,

Ми використовуємо Querydsl SQL в кількох наших власних проектах. У мене немає жодного особистого досвіду роботи, але я чув, що це цілком нормально.
пончао

11
Проблема QueryDsl полягає в тому, що ви не можете використовувати його як чистий генератор запитів, оскільки він не дає вам згенерованого запиту. Він створить запит і виконає його і для вас. Ви не можете дістати одне без іншого.
Абхінав Саркар

5
Querydsl та jOOQ, здається, є найпопулярнішим та зрілим вибором, проте слід пам’ятати про одне: обидва покладаються на концепцію генерації коду, де мета-класи створюються для таблиць та полів баз даних. Це полегшує приємний чистий DSL, але він стикається з проблемою при спробі створити запити для баз даних, які відомі лише під час виконання, як у прикладі ОП вище. Хоча jOOQ підтримує наближений на основі рядків, є деякі химерності. Документація Querydsl не вказує, чи можливо не використовувати генерацію коду. Будь ласка, виправте мене, якщо я помиляюся.
Свен Якобс

3
@SvenJacobs дуже старий коментар, але оновлення, QueryDSL дійсно дозволяє будувати SQL без генерації коду: stackoverflow.com/questions/21615956 / ...
Нагараджа Tantri

7

ddlutils - мій найкращий вибір: http://db.apache.org/ddlutils/api/org/apache/ddlutils/platform/SqlBuilder.html

ось створити приклад (groovy):

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, тому біль.
huuthang

6

Я можу порекомендувати jOOQ . Він надає безліч чудових функцій, також інтуїтивно зрозумілий DSL для SQL та надзвичайно вагомий підхід до реверсивної інженерії.

jOOQ ефективно поєднує складний SQL, безпеку типу, генерацію вихідного коду, активні записи, збережені процедури, вдосконалені типи даних та Java в безперебійному, інтуїтивно зрозумілому DSL.


Чи використовуєте ви це? Як ви його знайдете?
Владислав Раструсний

3
Я використовую його для створення спеціального вихідного коду з DDL. Це чудово працює!
Крістофер Клеуз

"Хоча бібліотека jOOQ має чудовий API для побудови операторів SQL, вона постачається з усім набором інструментів для складання операторів, підключення до баз даних, запису / читання моделей в / з баз даних тощо. Завдяки сучасній природі програми Androids VM , існує обмежувальний ліміт методу 64k. При використанні jOOQ може містити понад 10000 посилальних методів. Це може здатися не надто порівняно з обмеженням, але якщо ви вважаєте інші широко використовувані великі бібліотеки (наприклад, Guava та Google Play Services) , натиснувши цю межу 64k, стає набагато простіше ". - android-arsenal.com/details/1/3202 :(
Томаш Фейфар

3

API критерії сплячки (не звичайний SQL, але дуже потужний і в активному розвитку):

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
це не генерує SQL і є кошмаром для налагодження, коли воно не дотримується правила найменшого здивування (не працює, як очікувалося)

Він генерує SQL (наприкінці), і це нікого не дивує. Перевага - це портативне використання в базі даних.
Володимир Дюжев

3
Який рівень складності запитів, який ви досягли за допомогою API критеріїв JPA, не роблячи запит абсолютно нечитабельним? Чи є у вас приклад вкладеного вибору в IN/ EXISTSклаузі чи самостійного приєднання, використовуючи псевдоніми для Saleсутності тощо? Мені цікаво
Лукаш Едер

1
Коментарі не дають багато місця для надання прикладів, але ви можете переглянути їх на docs.jboss.org/hibernate/core/3.5/reference/en/html/…
Володимир Дюжев

0

Ви можете використовувати таку бібліотеку:

https://github.com/pnowy/NativeCriteria

Бібліотека побудована у верхній частині Hibernate "create sql query", щоб вона підтримувала всі бази даних, підтримувані Hibernate (підтримується сеанс Hibernate та JPA). Інструмент для побудови будівельників доступний і так далі (об’єктні картографи, картографи результатів).

Ви можете знайти приклади на сторінці github, бібліотека доступна в центрі Maven.

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

це складніше, ніж просто написати SQL вручну
EpicPandaForce

@EpicPandaForce Я погоджуюся на дуже прості випадки, але конкатенація є дуже складною, коли потрібно сформулювати цей рядок на основі дуже складних умов, коли існує інший набір цих умов. Правильно з'єднаний рядок тоді (як і всі додавання, з'єднання, наявність, встановлення параметрів тощо) - це біль. За рішенням у вас є конструктор, який буде вирішувати цю складність для вас.
Przemek Nowak
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.