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

jOOQ支持嵌套行的解析吗?

夏侯朝斑
2023-03-14

我正在评估我们是否可以为我们的项目从普通JDBC迁移到jOOQ。其中大部分看起来很有希望,但我现在想知道一个特定的流:嵌套行。让我解释一下。

假设您有以下两张表:

class(id, name)
student(id, name, class_id)

(我们假设一个学生只能是一个班级的一员。)

让我们为这些表创建一个响应类型。我将在下面的查询中使用这些。

create type type_student as(id integer, name text);
create type type_class as(id integer, name text, students type_student[]);

现在让我们使用嵌套行获取所有带有学生的类:

select row(class.id, class.name, array
       (
         select row(student.id, student.name)::type_student
         from   student
         where  student.class_id = class.id
       ))::type_class
from   class

一种有用的变体是仅在数组中使用嵌套行:

select class.id, class.name, array
       (
         select row(student.id, student.name)::type_student
         from   student
         where  student.class_id = class.id
       ) as students
from   class

我想知道jOOQ是否有一种优雅的方法来解析包含嵌套行的结果?

共有2个答案

席嘉祯
2023-03-14

是的,它可以:https://www.jooq.org/doc/latest/manual/sql-building/table-expressions/nested-selects/

Field<Object> records =
create.select(student.id, student.name)
      .from(student)
      .where(student.class_id.eq(class.id)
      .asField("students");

create.select(class.id, class.name, array, records)
      .from(class)
      .fetch();

上面的例子可能不会直接起作用,因为我没有尝试过,但只是想给出一个大致的想法。

注意:对象记录不是单独执行的。当在第二个语句中调用fetch时,JOOQ应该在内部创建一个SQL语句。

傅旺
2023-03-14

你使用“parse”这个词可能意味着几件事,如果有人发现这个问题是在寻找“jOOQ”/“parse”/“row”,我会一一回答。

尚未(截至jOOQ 3.10和3.11)。jOOQ附带了一个SQL解析器,可以解析(几乎)任何可以使用jOOQ API表示的内容。这有多种好处,包括:

  • 能够对代码生成器的DDL脚本进行逆向工程
  • 在方言之间翻译SQL(请参阅此处的在线版本:https://www.jooq.org/translate)

不幸的是,它还不能解析投影中的行值表达式,即在SELECT子句中。

是的,您可以使用各种DSL使用它们。row()构造函数,主要用于谓词,也用于投影,方法是使用DSL将它们包装在字段中。在jOOQ 3.11中,这仍然是一个实验,因为PostgreSQL本身有很多边缘情况,与什么是允许的,什么是不允许的有关。但原则上,像你这样的查询应该是可能的

PostgreSQL支持这些匿名记录类型,以及命名的“复合”类型。及其数组。以及数组和复合类型的嵌套。如果类型信息对jOOQ可用,即如果您使用代码生成器,jOOQ可以序列化和反序列化这些类型。例如,如果您的查询存储为视图

create view test as
select row(class.id, class.name, array
       (
         select row(student.id, student.name)::type_student
         from   student
         where  student.class_id = class.id
       ))::type_class
from   class

然后,代码生成器将产生适当的类型,包括:

  • 类型研究记录
  • TypeClassRecord

可以按预期序列化。原则上,这在没有代码生成器的情况下也是可能的,但您必须自己手动创建上述类型,所以为什么不直接使用代码生成器呢。

 类似资料:
  • 问题内容: 我必须与API进行交互,并且响应格式(根据我的阅读)似乎结构不良。我发现一个Google 网上论坛在这里回答了一个类似的问题,但是我在实现Response类来处理Gson.fromJson时遇到了麻烦。有没有我想念的例子? 问题答案: JSON对象可以由或Javabean类表示。这是一个使用Javabean的示例。 如下使用它:

  • 问题内容: jOOQ是否结合PostgreSQL提供对JSR310的支持?特别是,我尝试使用以下类: 我正在存储以下数据类型(根据http://www.postgresql.org/docs/9.1/static/datatype- datetime.html ): : : : : 这些数据类型正确吗? jOOQ是否支持,和之间以及上述四个类之间的转换(双向)? 问题答案: jOOQ路线图 直到j

  • jOOQ是否结合PostgreSQL为JSR310提供支持?特别是,我尝试使用以下类:

  • 我正试图用jooq编写这个查询 我尝试了几件事,但没有成功。到目前为止,我只得到 如何将num列添加到结果中?感谢您的帮助。

  • 你能给我建议正确的方法来启动加密路线吗。

  • 我正在尝试为我的项目使用插件,但在运行命令时得到错误。谁能帮助解决这个问题。提前道谢。 我的Build.sbt 名称:=“包装” 版本:=“1.0” enablePlugins(JDKPackagerPlugin) 我的主要班级 我的plugins.sbt