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

Tout le monde connaît une bonne bibliothèque de construction SQL pour Java comme Squiggle (elle n’est plus maintenue). 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

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

Querydsl et jOOQ sont deux choix populaires.

Je peux recommander jOOQ . Il offre de nombreuses fonctionnalités, une interface DSL intuitive pour SQL et une approche de reverse engineering extrêmement personnalisée.

JOOQ combine efficacement SQL complexe, la sécurité des types, la génération de code source, les enregistrements actifs, les procédures stockées, les types de données avancés et Java dans un langage DSL intuitif et fluide.

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

voici un exemple de création (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 

Hibernate Criteria API (pas de 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(); 

Vous pouvez utiliser la bibliothèque suivante:

https://github.com/pnowy/NativeCriteria

La bibliothèque est construite sur le dessus de la requête Hibernate “create sql”, elle prend donc en charge toutes les bases de données sockets en charge par Hibernate (la session Hibernate et les fournisseurs JPA sont pris en charge). Le modèle de générateur est disponible et ainsi de suite (mappeurs d’objects, mappeurs de résultats).

Vous pouvez trouver les exemples sur la page github, la bibliothèque est bien sûr disponible au centre de 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")));