我正在尝试在第一次初始化后添加要选择的字段。似乎没有办法做到这一点,因为它只是重新创建一个。
String select = "actor_id,first_name,last_name,last_update";
DSLContext context = DSL.using(SQLDialect.DEFAULT);
Select select = context.select();
for (String field : select.split(",")) {
select = context.select(field(name(field)));
}
System.out.println(select.getSQL());
// The value is always SELECT last_update ...
// But I need select actor_id,first_name,last_name,last_update ...
我没有看到保留select的方法,然后在代码流中需要时将WHERE,LIMIT等添加为后续步骤。一切都应该在同一步骤完成吗?
类似的东西:
select = select("test");
// code
// code
select = select("another field");
// code
// And add other sql statements to the DSL and finally get the sQL
答案 0 :(得分:1)
在您提供的代码段中,select
的值始终为" last_update"因为for循环在每次迭代时重新分配select
。最后一个评估值是" last_update",很自然地,select
结束的是什么。
这是一种初始化Select
并使用全部列进行选择的方法,而不是逐个字段地构建它:
final List<Field<?>> projection = new ArrayList<Field<?>>();
final String columnNames = "actor_id,first_name,last_name,last_update";
for(String columnName : columnNames.split(",")) {
projection.add(field(name("Tblactor", columnName)));
}
Select query = context.select(projection);
...
希望有所帮助!
答案 1 :(得分:1)
虽然hsl's answer显示了将整个投影存储在局部变量中的更好方法,但我只是简单地评论你所犯的错误,这很简单:
SelectSelectStep select = context.select();
for (String field : select.split(",")) {
// Your code: This always creates a new select statement from scratch
// select = context.select(field(name(field)));
// The code you meant to write
select = select.select(field(name(field)));
}