Spring boot GraphQLJava:分组SQL和映射
我正在构建graphql java spring启动应用程序。 假设我有这个模式: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
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,你有什么特别的想法吗?