2016-12-03 42 views
1

我使用和jpa,我试图从jparepository从父实体和子实体获取数据。jpa存储库findAll与父母和孩子使用可配页

父实体:

@Entity 
@Table(name = "parent") 
public class Parent { 
    @Id 
    private int id; 

    private String name; 

    @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY) 
    private Set<Child> children; 
} 

子实体:

@Entity 
@Table(name = "child") 
public class Child { 

    @Id 
    private int id; 

    private String name; 

    private int parent_id; 

    @ManyToOne 
    @JoinColumn(name = "parent_id", referencedColumnName = "id") 
    private Parent parent; 

jpaRepository:

public interface ParentRepository extends JpaRepository<Parent, Integer>, JpaSpecificationExecutor<Parent> { 

} 

我的fecth设置为FetchType.LAZY的原因是,有时我只是想获得父母没有孩子。

所以,这里是我的问题: 当我使用

parentRepository.findAll(pagable); 

结果只包含父母,没有孩子,但我想要的结果包含的孩子,而且在某些情况下,我不希望它。如何写它?

+0

你可以用@Transactinal注解做到这一点。 有关更多详细信息,请参阅此答案http://stackoverflow.com/questions/26611173/jpa-jta-transactional-spring-annotation/26615390#26615390 –

回答

1

要获取子集合,您可以声明一个实体图。事情是这样的:

@NamedEntityGraph(
    name = "parent.withChildren", 
    attributeNodes = { 
      @NamedAttributeNode("children") 
    } 
) 

然后与资料库的方法使用它:

@EntityGraph("parent.withChildren") 
Page<Parent> findWithChidren(Pageable page); 
+0

这是我推荐的解决方案! 我知道有一种不同的方法来执行它,调用“getChild”,但是如果你需要这样做的话,你会很困惑,所以连接没有关闭,避免了Lazy异常。使用JPA 2.1解决方案保持简单。为赢得命名实体图! –

+0

谢谢!它真的解决了我的问题! –