web-dev-qa-db-fra.com

Existe-t-il une bonne bibliothèque de construction SQL dynamique en Java?

Tout le monde connaît une bonne bibliothèque de construction SQL pour Java comme Squiggle (non maintenu, semble-t-il.). De préférence, un projet en développement actif.

De préférence avec une syntaxe comme Zend_Db_Select , quelque chose qui permettra de faire une requête comme

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

Querydsl et jOOQ sont deux choix populaires.

48
ponzao

ddlutils est mon meilleur choix: http://db.Apache.org/ddlutils/api/org/Apache/ddlutils/platform/SqlBuilder.html

voici create example (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
6
qxo

Je peux recommander jOOQ . Il fournit de nombreuses fonctionnalités, un DSL intuitif pour SQL et une approche de rétroingénierie extrêmement personnalisable.

jOOQ combine efficacement SQL, sécurité de types, génération de code source, enregistrements actifs, procédures stockées, types de données avancés et Java dans un DSL intuitif et fluide).

6
Christopher Klewes

API Hibernate Criteria (pas un langage SQL simple, mais très puissant et en développement actif):

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();
2
Vladimir Dyuzhev

Vous pouvez utiliser la bibliothèque suivante:

https://github.com/pnowy/NativeCriteria

La bibliothèque est construite au sommet de la "requête SQL" de Hibernate afin de prendre en charge toutes les bases de données prises en charge par Hibernate (la session Hibernate et les fournisseurs JPA sont pris en charge). Le modèle de générateur est disponible, etc. (mappeurs d'objets, mappeurs de résultats).

Vous pouvez trouver les exemples sur la page github, la bibliothèque est bien sûr disponible sur Maven central.

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")));
0
Przemek Nowak