我创建了一个 util 方法:
public <T> Optional<T> fetch(Class<T> clazz, Object id, String... relations) {
EntityGraph<T> graph = entityManager.createEntityGraph(clazz);
Stream.of(relations).forEach(graph::addSubgraph);
return Optional.ofNullable(entityManager.find(clazz, id, Collections.singletonMap("javax.persistence.loadgraph", graph)));
}
Run Code Online (Sandbox Code Playgroud)
因此,例如如果User有lazy ordersand wallets,我可以这样做:
Optional<User> user = fetch(User.class, 1, "orders", "wallets");
Run Code Online (Sandbox Code Playgroud)
但我不知道如何采取orders或wallets懒惰的收藏。如果我能调用这样的方法那就太好了:
Optional<User> user = fetch(User.class, 1, "orders", "orders.products", "wallet");
Run Code Online (Sandbox Code Playgroud)
我如何扩展该方法来实现这一目标?
我决定使用下一个方法:
public <T> Optional<T> fetch(Class<T> clazz, Object id, String... relations) {
EntityGraph<T> graph = entityManager.createEntityGraph(clazz);
Stream.of(relations).forEach(path -> {
String[] splitted = path.split("\\.");
Subgraph<T> root = graph.addSubgraph(splitted[0]);
for (int i = 1; i < splitted.length; i++)
root = root.addSubgraph(splitted[i]);
});
return Optional.ofNullable(entityManager.find(clazz, id, Collections.singletonMap("javax.persistence.loadgraph", graph)));
}
Run Code Online (Sandbox Code Playgroud)
它只有一个缺陷。接下来的两个将起作用:
Optional<User> user = fetch(User.class, 1, "orders", "orders.products", "wallet");
Optional<User> user = fetch(User.class, 1, "orders.products", "wallet");
Run Code Online (Sandbox Code Playgroud)
下一篇不会:
Optional<User> user = fetch(User.class, 1, "orders.products", "orders", "wallet");
Run Code Online (Sandbox Code Playgroud)
那是因为orders覆盖orders.products. 我认为这就足够了,因为从逻辑上讲,如果你想加载orders.products,无论如何你都必须加载orders。
| 归档时间: |
|
| 查看次数: |
1686 次 |
| 最近记录: |