当前位置: 首页 > 知识库问答 >
问题:

JOOQ-使用字符串名称连接表

蒲曦
2023-03-14

我有一个应用程序正在从jooq切换到jdbc,我使用jdbc创建了一个表,但我需要编辑一些jooq查询来加入它,问题是自动生成的jooq tables类无法识别它,所以有没有办法通过字符串名引用表?

下面是一些示例代码:

private final Business BUSINESS = Tables.BUSINESS; // table that jooq auto generated in jar file
....

Map<BusinessRecord, List<BusinessAddressRecord>> resultMap = dslContext
.select()
.from(BUSINESS.leftOuterJoin(BUSINESS_ADDRESS).on(BUSINESS.ID.eq(BUSINESS_ADDRESS.BUSINESS_ID)))
.where(BUSINESS.ID.equal(id))
.and(BUSINESS_ADDRESS.DEACTIVATED_AT.isNull())
.fetchGroups(
    a -> a.into(BUSINESS),
    b -> b.into(BUSINESS_ADDRESS)
);

我如何在此处加入“连接”表?没有桌子。连接,因为它是以不同的方式创建的。

有很多疑问,所以我们希望根据需要逐步进行转换。

更新:我尝试添加以下内容,并且查询运行,但是我尝试获取的字段总是空的,我猜是因为BusinessRecord表没有与DTO相同的字段,所以如何解决这个问题?

Map<BusinessRecord, List<BusinessAddressRecord>> resultMap = dslContext
.select()
.from(BUSINESS)
.leftOuterJoin(BUSINESS_ADDRESS)
.on(BUSINESS.ID.eq(BUSINESS_ADDRESS.BUSINESS_ID))
.join("connection")
.on("CAST(connection.business_id as bigint) = business.id")
.where(BUSINESS.ID.equal(id))
.and(BUSINESS_ADDRESS.DEACTIVATED_AT.isNull())
.fetchGroups(
    a -> a.into(BUSINESS),
    b -> b.into(BUSINESS_ADDRESS)
);

共有1个答案

韩彬
2023-03-14

您当前正在运行一个对多连接查询,其中对于1BUSINESS,您有许多BUSINESS_ADDRESS条目。如果您想加入1BUSINESS和许多CONNECTION条目之间的另一种多对多关系,您将在BUSINESS_ADDRESSCONNECTION之间获得笛卡尔乘积,这可能不是您想要的。

你想要的输出数据结构看起来像这样:

class Business {
  // Business properties ...
  List<Address> addresses;
  List<Connection> connections;
}

对于jOOQ,这种集合嵌套最好直接使用SQL通过数组或SQL/JSON或SQL/XML完成。有关详细信息,请参阅此博客文章。

注意,直接使用JDBC实现这类事情将变得更加困难。

可以使用普通SQL模板或使用标识符将代码生成器中的表与代码生成器不可用的表混合。

但是一旦你不再使用生成的代码,jOOQ将不再提前知道你的投影将产生什么列。您没有显式地指定投影,因此选择()将产生一个SQL的SELECT*查询。假设您真的需要所有这些列,那么您目前遇到的问题是:

  • 您实际上没有从连接表映射任何内容。您正在投影它的列,但是您的fetchGroups()表达式继续只引用其他两个表中的列
  • 当您将生成的代码与普通SQL模板混合使用时,各个表的列之间可能存在歧义,jOOQ无法再正确解析映射。这也可能导致错误的结果

所以,简而言之:要知道你的任务不仅仅是添加一个连接。您可能还必须更新投影(SELECT子句)和映射(fetchGroups())表达式。但我确实建议查看此查询的目标是什么,并可能恢复到嵌套集合方法

 类似资料:
  • 问题内容: 计划使用字符串值来引用我要更新的变量。组合来自几个不同用户选择来源的字符串。有很多使用if / case语句的可能性。提前致谢 问题答案: 如何使用字典? 这将使您实现所需的功能-存储不同键的值。 例如,代替使用 你可以用 要将值存储在字典中,只需使用 并从字典中获取值,请使用 所以,你可以使用这样的东西 顺便提一句,您可以真正清理一些代码

  • 问题内容: 我使用来了解Java与运算符的工作方式。 它是用同样的操作? 问题答案: 不。使用和做不一样。 在Java中,字符串实例是不可变的。 因此,如果您这样做: 每次连接时都在创建新的字符串。 另一方面,StringBuilder就像一个缓冲区,可以在追加新Strings时根据需要增长。 经验法则是(由于我的评论而改变): 如果要进行大量连接(例如,在循环内进行连接,或生成由多个字符串连接的

  • 你能告诉我如何改变我的regex字符串模式来验证带有连字符的第二个名称吗?

  • 我正在使用Node.js程序将数据插入MongoDB数据库。我已将数据插入到名为“repl-failOver”的集合中。 当我使用Mongo shell并使用< code>show collections列出数据库中的集合时,我能够看到集合“repl-failOver”。 如何从mongoshell为这个集合运行查找命令?

  • 问题内容: 我有以下代码 输出为。 Java如何完成字符串连接的技巧? 问题答案: 因为Java将表达式转换为类似 实际上,我认为它可能使用s,因此: 解决更高效 这使用“ 字符串”构建器上的方法(针对每种类型),这些方法可以正确处理

  • 本文章将介绍Thymeleaf标准表达式语法中的概念。 学习如何在Thymeleaf模板中显示对象(Bean)的属性值。 已经将类的bean已经设置为名称为的上下文模型。 为这些和属性添加一些格式,学习使用字符串相连接输出。 最后,修改模板以获得一个合理的静态原型(例如,通过一些原型数据替换并显示结果)。 如果要上机实践,请参考:Thymeleaf+SpringMVC5示例项目。这里不再重复创建项