gpt4 book ai didi

java - 使用 Spring 和 Hibernate 从多个表连接中检索数据

转载 作者:行者123 更新时间:2023-12-02 03:45:06 24 4
gpt4 key购买 nike

我有一些带有关联链的 Spring 实体和存储库:

根 -> Foo -> Bar -> Qux -> ...

类似这样的事情:

class Root {
private String rootData;
@OneToOne
private Foo foo;
}

class Foo {
private String fooData;
@OneToOne
private Bar bar;
}

class Bar {
private String barData;
@OneToOne
private Qux qux;
}

class Qux {
private String quxData;
@OneToOne
private GoesOn goesOn;
}

有数十万个 Root 对象,并且所有关联都是惰性的。

我需要创建一个报告,列出所有根对象以及以下数据:

  • 根数据
  • fooData
  • 栏数据
  • qux数据

如果我尝试通过关联导航来填充报告,则每个根对象都会对数据库进行 N 次查询。

有没有一种方法可以使用联接通过单个查询检索所有数据,而不将关联更改为 eager?

最佳答案

您可以使用实体图来指定应直接获取哪些属性(以 eagar 方式)

您用

注释您的实体之一
@NamedEntityGraph(
name = "report-eg",
attributeNodes = {
@NamedAttributeNode("foo"),
@NamedAttributeNode(value = "bar", subgraph = "bar-eg"),
},
subgraphs = {
@NamedSubgraph(
name = "bar-eg",
attributeNodes = {
@NamedAttributeNode("qux")
}
)
}
)

然后你在 fetch 中使用它

EntityGraph entityGraph = entityManager.getEntityGraph("report-eg");
Map<String, Object> properties = new HashMap<>();
properties.put("javax.persistence.loadgraph", entityGraph);
Post post = entityManager.find(Foo.class, id, properties);

显然,您可能需要根据您的需要调整一些图表,但它向您展示了前进的方向。

或者,您可以使用 Criteria API。它允许直接指定应该获取哪些关系(与 join 相反)

关于java - 使用 Spring 和 Hibernate 从多个表连接中检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56812142/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com