112

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

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

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

5 回答 5

59

QuerydsljOOQ是两个流行的选择。

于 2011-04-11T14:51:37.607 回答
7

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

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

于 2011-04-11T15:00:00.937 回答
7

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
于 2013-07-05T15:14:14.827 回答
3

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();
于 2011-04-11T18:56:37.560 回答
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")));
于 2014-07-06T09:12:46.493 回答