Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JOOQ查询以连接WITH子句_Java_Sql_Jooq_With Clause - Fatal编程技术网

Java JOOQ查询以连接WITH子句

Java JOOQ查询以连接WITH子句,java,sql,jooq,with-clause,Java,Sql,Jooq,With Clause,如何编写JOOQ查询以连接with子句中的字段 例如,我尝试过: create.with("a").as(select( val(1).as("x"), val("a").as("y") )) .select() .from(tableByName("a") .join(ANOTHER_TABLE)

如何编写JOOQ查询以连接with子句中的字段

例如,我尝试过:

create.with("a").as(select(
                           val(1).as("x"),
                           val("a").as("y")
                   ))
      .select()
      .from(tableByName("a")
      .join(ANOTHER_TABLE)
          .on(ANOTHER_TABLE.ID.eq(tableByName("a").field("x")))
      .fetch();

但是,由于编译器不知道tableByNamea.fieldx的类型,因此无法解析使用哪个eq方法。既然我知道类型,有没有一种方法可以显式地提供它?或者我是否应该采取另一种方法从with子句加入字段?

首先声明CTE如何?


如果这不起作用,您总是可以通过字段获取数据类型或类,您可以通过表格获取。

虽然我当然同意这一点,但我将快速添加一个回答,回答您的特定编译错误问题

当前连接谓词有三个错误:

另一个_TABLE.ID.eqtableByNamea.fieldx 不推荐使用。通常建议改用。 这种动态构造的表不知道其任何字段引用,因此tablenamea.fieldx将返回null 编译错误是由于ID引用的类型可能是Field,因此该方法也需要一个Field参数。在不知道字段x的类型的情况下,jooqapi/Java编译器推断字段,这是无效的。 因此,解决方案是写:

//字段名,类 另一个_TABLE.ID.eqfieldnamea,x,Integer.class //字段名,数据类型 另一个_TABLE.ID.eqfieldnamea,x,另一个_TABLE.ID.getDataType
即使用,或者如果您使用的是自定义数据类型绑定/转换器。

谢谢,但这仍然无法帮助编译器解决要使用哪个eq重载。Lukas使用fieldName的答案是,在传入类型的地方使用类重载。
CommonTableExpression<Record2<Integer, String>> a =
  name("a").fields("x", "y").as(select(val(1), val("a")));

create.with(a)
      .select()
      .from(a)
      .join(ANOTHER_TABLE)
      .on(ANOTHER_TABLE.ID.eq(a.field("x")))
      .fetch();