如何在JOOQ中添加多个字段来选择语句?

时间:2017-07-22 22:51:13

标签: java sql jooq

我正在尝试在第一次初始化后添加要选择的字段。似乎没有办法做到这一点,因为它只是重新创建一个。

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

2 个答案:

答案 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)));
}