在Java中有没有好的dynamicSQL构build器库?
任何人都知道一些好的SQLbuild设者库像Squiggle (不再维护了)。 最好是一个积极发展的项目。
最好使用像Zend_Db_Select这样的语法,这将允许进行查询
String query = db.select().from('products').order('product_id');
Querydsl和JOOQ是两种stream行的select。
我可以推荐jOOQ 。 它提供了许多强大的function,也是一个直观的DSL的SQL和一个极端的可逆的反向工程方法。
jOOQ以stream畅,直观的DSL将复杂的SQL,types安全,源代码生成,活动logging,存储过程,高级数据types和Java有效地结合在一起。
ddlutils是我最好的select: http : //db.apache.org/ddlutils/api/org/apache/ddlutils/platform/SqlBuilder.html
这里是创build示例(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(虽然不是普通的SQL,但function非常强大,并且在主动开发中):
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();
您可以使用以下库:
https://github.com/pnowy/NativeCriteria
该库build立在Hibernate“创buildsql查询”的顶部,因此它支持Hibernate支持的所有数据库(支持Hibernate会话和JPA提供程序)。 build造者模式是可用的等(对象映射器,结果映射器)。
你可以在github页面上find例子,当然在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")));