Is there any good dynamic SQL builder library in Java?

任何人都知道一些很好的 Java SQL 构建器库,比如 Squiggle(似乎不再维护了)。最好是一个正在积极开发的项目。

最好使用像 Zend _ Db _ Select这样的语法,这样可以使查询类似于

String query = db.select().from('products').order('product_id');
146624 次浏览

Querydsl and JooQ are two popular choices.

我可以推荐 JooQ。它提供了许多很棒的特性,还提供了一个直观的 SQL DSL 和一个非常可定制的逆向工程方法。

JOOQ 有效地将复杂的 SQL、类型安全、源代码生成、活动记录、存储过程、高级数据类型和 Java 结合在一个流畅、直观的 DSL 中。

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

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

您可以使用以下库:

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