【问题标题】:How add multiple fields to select statement in JOOQ?如何在 JOOQ 中为 select 语句添加多个字段?
【发布时间】:2017-07-25 15:03:53
【问题描述】:

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

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 ...

我看不到保留选择的方法,然后在代码流中需要时添加 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

【问题讨论】:

    标签: java sql jooq


    【解决方案1】:

    在您提供的 sn-p 中,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);
    ...
    

    希望有帮助!

    【讨论】:

      【解决方案2】:

      虽然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)));
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-29
        • 1970-01-01
        • 2013-09-17
        • 2012-01-19
        • 2020-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多