Java中是否有任何良好的动态SQL构建器库?

Vla*_*sny 104 java sql sqlbuilder

任何人都知道像Squiggle这样的一些优秀的SQL构建器库(似乎不再维护).优选地,正在积极开发的项目.

最好使用类似Zend_Db_Select的语法,这样可以进行类似的查询

String query = db.select().from('products').order('product_id');
Run Code Online (Sandbox Code Playgroud)

pon*_*zao 49

QuerydsljOOQ是两个受欢迎的选择.

  • QueryDsl的问题在于您不能将它用作纯查询生成器,因为它不会为您提供生成的查询本身.它将生成查询并为您执行它.你不能没有另一个. (10认同)
  • JOOQ可能是硬核SQL开发的更好选择,但Querydsl有一个更简单的API,并支持其他后端(JPA,JDO,Lucene,Mongodb等); 我也是Querydsl背后的公司 (6认同)
  • Querydsl和jOOQ似乎是最受欢迎和最成熟的选择,但有一点需要注意:两者都依赖于代码生成的概念,即为数据库表和字段生成元类.这有利于一个漂亮,干净的DSL,但在尝试为仅在运行时已知的数据库创建查询时会遇到问题,例如上面的OP示例.虽然jOOQ支持基于String的接近,但有一些怪癖.Querydsl的文档没有提到是否可以不使用代码生成.如果我错了,请纠正我. (5认同)
  • @SvenJacobs非常古老的评论,但要更新,QueryDSL确实允许在没有代码生成的情况下构建sql:http://stackoverflow.com/questions/21615956/how-to-construct-query-in-querydsl-without-domain-classes (3认同)

Chr*_*wes 6

我可以推荐jOOQ.它提供了许多出色的功能,还有一个直观的SQL for SQL和极其可靠的逆向工程方法.

jOOQ在流畅,直观的DSL中有效地结合了复杂的SQL,类型安全,源代码生成,活动记录,存储过程,高级数据类型和Java.

  • 我用它来从DDL生成自定义源代码.它工作得很棒! (3认同)

qxo*_*qxo 6

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
Run Code Online (Sandbox Code Playgroud)