jOOQ:“错误:关系CTE不存在”

时间:2019-12-10 16:39:16

标签: java sql common-table-expression jooq

使用jOOQ 3.11.2和Postgres 9.4,我试图在第二个CTE的定义中重用一个jOOQ CTE。

对于每个StackOverflow问题How to re-use one CTE in another CTE in jOOQ,以下内容均不正确

   CommonTableExpression<...> cteTwo = name().fields().as(select( with(cteOne ... ).from(cteOne) );

基于以上答案,我完全省略了cteTwo中的with(cteOne)子句。我尝试过:

  import static org.jooq.impl.DSL.*;

  CommonTableExpression<...> cteOne = name().fields().as(select(...); 
  CommonTableExpression<...> cteTwo = name().fields().as(select().from(cteOne) ); // seem to need with(cteOne) here. 

      List<someDTO> result = create
                 .with(cteOne)
                 .with(CteTwo)
                 .select(...)
                  .from(cteTwo)
                  .fetchInto(someDTO.class);

上面的代码可以编译,但运行时出错:'jooq:错误的SQL语法。 ...错误:关系\“ cteOne \”不存在。查看生成的SQL,在cteTwo中没有对cteOne的引用。

然后我尝试将with(cteOne)子句放在cteTwo定义内的不同位置。在SELECT子句之前只能尝试三个地方。没有一个是正确的:

  CommonTableExpression<...> cteTwo = with(cteOne).name().fields().as(select(  ... ).from(cteOne) ); 
  CommonTableExpression<...> cteTwo = name() with(cteOne).fields().as(select(  ... ).from(cteOne) ); 
  CommonTableExpression<...> cteTwo = name().fields().with(cteOne).as(select(  ... ).from(cteOne) ); 

请注意,这不同于定义多个CTE,然后在最终的select语句中使用每个CTE,如下所示:

 CommonTableExpression<...> cteAlpha = name(...).fields(...).as(select(...);
 CommonTableExpression<...> cteBeta = name(...).fields(...).as(select(...);

  List<SomeDTO> list = create
  .with(cteAlpha)
  .with(cteBeta)
  .select(...) from(cteAlpha, cteBeta).fetchInto(SomeDTO.class);  

我还没有找到有关此精确点的文档或示例。 应该怎么做?

1 个答案:

答案 0 :(得分:1)

我正在回答自己的问题。截至2020年1月1日,不可能将CTE链接起来。正如我在评论中指出的那样,解决方法是使用临时数据库表。就我而言,这是一种代码气味。最终,我解决了更大的问题,简化了我的代码,并且不需要解决链接CTE。

如果确实使用临时表,请记住在不再需要时删除表以防止数据库混乱。

请注意,jOOQ是一个维护良好的不断发展的库,在以后的版本中,可能会添加它。