java - 正确的 JOOQ 类与 DSLConext 创建和迭代结果一起使用

标签 java sql jooq

我是 JOOQ 的“新手”。

我在教程或 pdf 文档中找不到有关在使用 DSLContext 的 select 语句时使用几个类中的哪一个的详细信息。

select 的语法不正确,因为我相信 where 子句包含对 ifd 表的引用,该引用不在 from 中,也不在 join 中。我不确定如何实现正确的语法。

任何文档来源以及我做错了什么的指示都将受到赞赏。

Descriptor d = DESCRIPTOR.as("d");
Desclink dl = DESCLINK.as("dl");
Ifdesc ifd = IFDESC.as("ifd");
//
Result<Record2<Integer, Integer>> result = 
      dslContext.select(d.NETWORKID, dl.PARENT)
            .from(d)
            .join(dl).on(dl.PARENT.equal(d.DESCID))
            .where(ifd.DESCID.equal(dl.CHILD))
            .fetch()
      ;
for (Record2 r2 : result) {
    Integer n = r2.getValue( d.NETWORKID);
    Integer p = r2.getValue(dl.PARENT);
    logger.println("nwid : " + n + " p " + p );
}

最佳答案

我认为您所缺少的只是另一个加入:

dslContext.select(ifd.IPADDRESS, d.NETWORKID, dl.PARENT)
          .from(d)
          .join(dl).on(dl.PARENT.equal(d.DESCID))
          .join(ifd).on(dl.CHILD.equal(ifd.DESCID)) // another join here
          .fetch();

请注意,您可以连接任意数量的表以形成您自己的“表表达式”,以放入 SQL 中的 FROM 子句中。如果连接三个表:

A join B on ... 
  join C on ...

你真正在做的是(伪SQL):

T  := A' join C on ...
A' := A  join B on ...

因此,阅读上述“三重连接”的最佳方式是:

SELECT ...
FROM ((A join B on ...) join C on ...)

当使用 Table.join() 时,jOOQ API 还支持原生嵌套此类 JOIN 表达式。 。例如:

          ( A.join(B).on(...) ).join(C).on(...)
// A' --> ^^^^^^^^^^^^^^^^^^^^^
// T  --> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

SelectJoinStep.join()您使用的方法只是为了方便上述Table.join()

This might be an interesting read for you ,解释 SQL 中的 1-2 个语法内容。

关于java - 正确的 JOOQ 类与 DSLConext 创建和迭代结果一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22645028/

相关文章:

java - 错误 : annotation type not applicable to this kind of declaration

java - 如何向期望双倍的设置者提供 Integer ?

Java 手机 : Android or Blackberry?

mysql - 如何从表 A 中检索其 VARCHAR 列与另一个 VARCHAR 列部分匹配的行。在表B?

java - Jooq Java SpringBoot - 无法自动生成类

java - 有没有办法让 JButtons 换成新行,JOptionPane

sql - Mysql设置默认值为项目自动递增键

SQL WHERE ID IN (id1, id2, ..., idn)

java - jOOQ - 从 psql 查询构建更新

spring-boot - 如何使用 Spring-Boot 配置配置 JOOQ 设置?