2016-11-25 83 views
0

我創建了一個util的方法:JPA動態EntityGraph和子圖

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))); 
} 

所以,如果,例如,如果User有偷懶orderswallets,我可以這樣做:

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

但我不知道如何拿orderswallets懶惰的集合。這將是greate,如果我打電話給這樣的方法:

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

如何擴展方法來實現這一點?

回答

0

我決定用下一個方法:

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))); 
} 

它只有一個缺陷。接下來的兩個將工作:

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

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

下一個會不會:

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

這是因爲orders覆蓋orders.products。我認爲這就夠了,因爲如果你想加載orders.products,你必須加載orders