2016-08-21 83 views
0

我使用的弹簧数据的JPA /休眠/ MySQL的弹簧加载数据的孩子和查询的子属性

class A{ 
    private long id; 
    private Collection<B> myBs; 
} 

class B{ 
    private long id; 
    private int property; 
} 

我想装载A和myBs集合装载所有B S其中B.property > 5

所以我这样做:

private interface ARepository extends JpaRepository<A, Long>{ 

@Query("SELECT a, b " 
     + "FROM A a JOIN a.myBs b ON b.property > :prop" 
     + "WHERE a.id= :id ") 
public A getByIdPastB(@Param("id") long id, @Param("prop") Integer prop); 
} 

但是我得到的例外太多的作为,从数据存储检索。基本上,它检索表

_______________________________ 
A.id | B.id | B.a_id| B.prop 
2  | 1  | 2  | 8 
2  | 2  | 2  | 11 
2  | 3  | 2  | 7 

和而不是建立一个目的,并用3个乙对象填充,它试图建立3所述的与每一个B对象的对象。

现在我知道提取图表设法告诉JPA很聪明,但是在这里它不起作用。我怎样才能设置它来正确地做到这一点?有没有一种方法可以像

private A findWhereMyBsPropGreaterThan(Integer prop)然后只是把一个@EntityGraph注释呢?

回答

0

好了,那就是:

@NamedEntityGraph(name="full", attributeNodes={@NamedAttributeNode("myBs")}) 
class A{ 
} 

@EntityGraph("full) 
@Query("SELECT a" 
     + "FROM A a JOIN a.myBs b ON b.property > :prop" 
     + "WHERE a.id= :id ") 
public A getByIdPastB(@Param("id") long id, @Param("prop") Integer prop);