2016-02-12 123 views
0

鑄造@OneToMany字段我有@Entity,它看起來像延伸JPARepository在接口此JPA - 從查詢

@Entity 
public class Plane { 

    @Id 
    private Long planeid; 

    @OneToMany(fetch = FetchType.LAZY, targetEntity = Passenger.class, cascade ={CascadeType.ALL}, mappedBy = "planeid") 
    private List<Passenger> passengers; 

... 

我使用這樣的方法:

@Transactional 
public interface PlaneRepository extends JpaRepository<Plane, Long> { 

    @Query(value = "SELECT * FROM planes p JOIN passengers v USING(planeid) WHERE v.name = 'Carlos' GROUP BY p.planeid", nativeQuery = true) 
    List<Plane> findAllPlanesMatching(); 

} 

作爲該方法的結果我得到所有飛機物體的列表,其中有名爲'卡洛斯'的乘客,但每個飛機的物體列表中包含所有乘客列表,但我希望這個列表只有名爲'卡洛斯'的乘客。有沒有辦法做到這一點?

回答

0

您正在混合兩種模式:實體映射和本機查詢映射。您使用的原生查詢不直接與實體映射一起工作。看看這個討論:JPA : How to convert a native query result set to POJO class collection

在你的情況,我不明白爲什麼你不能用JPQL查詢一路通過JPA。

您需要映射在Passenger

@ManyToOne 
private Plane plane; 

一個@ManyToOne關係,並運行此查詢:

Query q = em.createQuery("FROM Passenger p WHERE p.name = :name") 
      .setParameter("name", "Carlos") 
      .getResultList(); 

您將獲得唯一的乘客匹配名稱卡洛斯,你可以訪問他們的飛機遍歷p.getPlane()