Java JPA动态实体图和子图

Java JPA动态实体图和子图,java,jpa,Java,Jpa,我创建了一个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 O

我创建了一个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)));
}
但我不知道如何接受
订单
,或
钱包
懒惰的收藏。如果我调用这样的方法,那就太好了:

Optional<User> user = fetch(User.class, 1, "orders", "orders.products", "wallet");
Optional user=fetch(user.class,1,“订单”,“订单.产品”,“钱包”);

如何扩展该方法以实现此目的?

我决定使用下一种方法:

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)));
}
公共可选获取(类clazz、对象id、字符串…关系){
EntityGraph图形=entityManager.createEntityGraph(clazz);
流(关系).forEach(路径->{
String[]splitted=path.split(“\\”);
子图根=graph.addSubgraph(拆分的[0]);
for(int i=1;i
它只有一个缺点。接下来的两个将起作用:

Optional<User> user = fetch(User.class, 1, "orders", "orders.products", "wallet");

Optional<User> user = fetch(User.class, 1, "orders.products", "wallet");
Optional user=fetch(user.class,1,“订单”,“订单.产品”,“钱包”);
可选用户=获取(user.class,1,“orders.products”,“wallet”);
下一个将不会:

Optional<User> user = fetch(User.class, 1, "orders.products", "orders", "wallet");
Optional user=fetch(user.class,1,“订单.产品”,“订单”,“钱包”);
这是因为
orders
覆盖了
orders.products
。我认为这就足够了,因为从逻辑上讲,如果你想加载
订单。产品
,你必须加载
订单

Optional<User> user = fetch(User.class, 1, "orders.products", "orders", "wallet");