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

时间:2011-04-11 12:05:05

标签: java sql sqlbuilder

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

最好使用类似Zend_Db_Select的语法,允许进行类似

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

5 个答案:

答案 0 :(得分:47)

QuerydsljOOQ是两种流行的选择。

答案 1 :(得分:6)

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

  

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

答案 2 :(得分: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

答案 3 :(得分:2)

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

答案 4 :(得分:0)

您可以使用以下库:

https://github.com/pnowy/NativeCriteria

该库建立在Hibernate的顶部"创建sql查询"所以它支持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")));