我正在使用来自http://openhms.sourceforge.net/sqlbuilder/的Java和SQLBuilder,并试图动态地构建SQL SELECT查询:
SelectQuery sql = new SelectQuery();
sql.addAllColumns().addCustomFromTable("table1");
sql.addCondition(BinaryCondition.like("column1", "A"));但是,它会创建如下字符串:
SELECT * FROM table1 WHERE ('column1' LIKE 'A')由于错误的引号('column1'),它不能正常工作。我认为它在.like()方法中需要一些Column对象。有没有办法用正确的引号创建查询?
发布于 2016-09-26 18:11:55
我找到了一个解决方案。我必须创建扩展CustomSql的新类Column,并将我的列名作为参数传递:
public class Column extends CustomSql {
public Column(String str) {
super(str);
}
}然后:
SelectQuery sql = new SelectQuery();
sql.addAllColumns().addCustomFromTable("table1");
sql.addCondition(BinaryCondition.like(new Column("column1"), "A"));或者不创建自己的类:
SelectQuery sql = new SelectQuery();
sql.addAllColumns().addCustomFromTable("table1");
sql.addCondition(BinaryCondition.like(new CustomSql("column1"), "A"));它创建了以下SQL查询,可以很好地工作:
SELECT * FROM table1 WHERE (column1 LIKE 'A')发布于 2016-09-26 00:07:30
BinaryCondition.like()接受作为Column Object的对象,然后在内部使用Converter.toColumnSqlObject(Object)将其转换为SqlObject。在Class DbTable和Class DbSchema中分别有一个名为findColumn(String columnName)和findSchema(String tableName)的方法,您可以在其中传递一个简单的String对象。试试这个,它会解决你的问题:
DbTable table1= schema.findSchema("table1");
DbColumn column1 = table1.findColumn("column1");
SelectQuery sql = new SelectQuery();
sql.addAllColumns().addCustomFromTable(table1);
sql.addCondition(BinaryCondition.like(column1, "A"));发布于 2016-09-26 18:19:57
请检查工作示例并重构您自己的查询
String query3 =
new SelectQuery()
.addCustomColumns(
custNameCol,
FunctionCall.sum().addColumnParams(orderTotalCol))
.addJoins(SelectQuery.JoinType.INNER, custOrderJoin)
.addCondition(BinaryCondition.like(custNameCol, "%bob%"))
.addCondition(BinaryCondition.greaterThan(
orderDateCol,
JdbcEscape.date(new Date(108, 0, 1)), true))
.addGroupings(custNameCol)
.addHaving(BinaryCondition.greaterThan(
FunctionCall.sum().addColumnParams(orderTotalCol),
100, false))
.validate().toString();https://stackoverflow.com/questions/39688531
复制相似问题