0

我有以下实体结构:

Route: -one-to-many-> :Stop: <-many-to-many-> :Child: <-many-to-many-> :Contact

所以我在每个实体类的顶部定义了以下命名实体图,这样我就可以优化我的查询,以了解我需要在这个层次结构中走多远:

路线:

@NamedEntityGraphs({
        @NamedEntityGraph(name = "Route.stop.child.contact",
                attributeNodes = {
                        @NamedAttributeNode(value = "stops", subgraph = "Stop.child.contact")
                }),
        @NamedEntityGraph(name = "Route.stop.child",
                attributeNodes = {
                        @NamedAttributeNode(value = "stops", subgraph = "Stop.child")
                }),
        @NamedEntityGraph(name = "Route.stop",
                attributeNodes = {
                        @NamedAttributeNode(value = "stops", subgraph = "Stop")
                })
})
public class Route {...}

停止:

@NamedEntityGraphs({
        @NamedEntityGraph(name = "Stop.child.contact",
                attributeNodes = {
                        @NamedAttributeNode(value = "children", subgraph = "Child.contact")
                }),
        @NamedEntityGraph(name = "Stop.child",
                attributeNodes = {
                        @NamedAttributeNode(value = "children", subgraph = "Child")
                }),
        @NamedEntityGraph(name = "Stop", attributeNodes = {})
})
public class Stop {...}

孩子:

@NamedEntityGraphs({
        @NamedEntityGraph(name = "Child.contact",
                attributeNodes = {
                        @NamedAttributeNode(value = "contacts", subgraph = "Contact")
                }),
        @NamedEntityGraph(name = "Child", attributeNodes = {})
})
public class Child {...}

接触:

@NamedEntityGraphs({@NamedEntityGraph(name = "Contact", attributeNodes = {})})
public class Contact {...}

我在我的 Repository 类中使​​用它们:

@EntityGraph(value = "Route.stop.child.contact", type = EntityGraph.EntityGraphType.LOAD)
Optional<Route> findRouteStopsChildrenContactsByRouteId(short routeId);

但是,我看不到正在执行任何连接查询,并且当我尝试访问停靠点的子节点时会抛出一个lazyinit 异常。我的理解是,这就是如何使用实体图来优化查询(即,当我必须为每个单独的站点获取子节点时出现 n+1 问题),但我没有运气让它工作。

关于我做错了什么的任何建议?

4

1 回答 1

0

试试这个对我有用。

@NamedEntityGraph(name = "Book.details", attributeNodes = @NamedAttributeNode("reviews"))
@Table(name = "Book")
public class Book  implements Serializable
{
    @OneToMany(cascade = CascadeType.ALL , mappedBy = "book" , fetch = FetchType.EAGER)
    //@OrderBy("no ASC")
    private List<Review> reviews ; 
}

2)获取记录(内部使用左外连接)。

@EntityGraph(value = "Book.details", type = EntityGraphType.FETCH)
  List<Book> getBooksByAuthName(String aname); 
于 2018-08-10T08:24:14.727 回答