Spring boot GraphQLJava:分组SQL和映射

Spring boot GraphQLJava:分组SQL和映射,spring-boot,graphql,jooq,graphql-java,Spring Boot,Graphql,Jooq,Graphql Java,我正在构建graphql java spring启动应用程序。 假设我有这个模式: type Foo { id: ID! name: String bars: [Bar] } type Bar { id: ID! name: String } query{ foo(arg: String): [Foo] } 在BE上,我使用的是JOOQ pojos 当前,所有的foo都被提取,然后对于每个foo,所有的条都通过另一个查询提取。 我想通过一个查询来实现这一点: select * from f

我正在构建graphql java spring启动应用程序。 假设我有这个模式:

type Foo {
id: ID! name: String bars: [Bar]
}
type Bar {
id: ID! name: String
}
query{
  foo(arg: String): [Foo]
}
在BE上,我使用的是JOOQ pojos

当前,所有的foo都被提取,然后对于每个foo,所有的条都通过另一个查询提取。 我想通过一个查询来实现这一点:

select * from foo 
left join bar on foo.id = bar.foo_id;
你知道如何做到这一点吗?我是一个真正的GraphQL新手

技术堆栈: 弹簧靴 约克 graphql java graphql java工具

嵌套集合的经典SQL策略 在您的简单示例中,左连接绝对是一个选项。这就是像JPA/Hibernate这样的ORM在后台获取嵌套集合时所做的工作。该战略有一些缺点:

存在数据重复。对于子表中的每个条形图,您将复制父表中匹配的FOO的数据。这会导致大量的开销通过电线传输。连接越多,即需要的嵌套越多,这种情况会变得越来越糟糕 有笛卡尔积。如果要一次性嵌套多个集合,必须在子表之间生成笛卡尔积。对于笛卡尔积,很难记住哪些组合实际上是合法的,哪些是连接树的工件。因此,您将返回运行几个查询,每个嵌套树分支一个查询 使用标准SQLJSON 但是,有一个更好的方法,从JOOQ3.14开始。您可以使用XML或JSON,具体取决于您使用的数据库方言。这里的关键特性是和,它允许将数据聚合到XML元素或JSON对象中。因为您将使用GraphQL生成JSON文档,所以我猜您将使用JSON

使用标准SQL(例如Oracle实现的标准SQL),您为示例生成的SQL查询可能如下所示:

选择 雅格 JSON_对象 键id值foo.id, 键名值foo.name, 键栏值 选择 雅格 JSON_对象 键id值bar.id, 键名值bar.name 从酒吧 其中bar.foo_id=foo.id 来自富 目前,这些方言应该能够支持和/或模仿它们,例如在PostgreSQL中:

蟑螂 DB2LUW11+ 氢 马里亚布10.2+ MySQL 5.7+ 甲骨文12c+ PostgreSQL

在SQL Server中使用的模拟在将来也可能成为可能

请注意,JSON_ArrayAg将空集聚合为NULL,而不是空[]

现成的解决方案
事实上,我以前就想到了这一点,即开箱即用。我们可能会在不久的将来这样做:

这非常有效。当然,我的模型有点复杂,但策略应用得非常好。特别是当与PostgreSQL的横向连接结合时。@K.Kostadinov:你已经在试验jOOQ 3.14了吗?@Lucas Eder:没有,还没有,我还在试验3.13.1,你有什么特别的想法吗?