JPA - 从Query中转换@OneToMany字段

时间:2016-02-12 23:20:33

标签: java hibernate jpa

我有@Entity,看起来像这样

@Entity
public class Plane {

  @Id
  private Long planeid;

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

...

我在扩展JPARepository的接口中使用了这样的方法:

@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();

}

作为这种方法的结果,我获得所有飞机物体的列表,其中有名为“Carlos”的乘客,但是在每个飞机物体内部列表包含所有乘客的列表,但我希望此列表中只有乘客称为'卡洛斯。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:0)

您正在混合两种模式:实体映射和本机查询映射。您使用的本机查询不能直接与实体映射一起使用。看看这个讨论:JPA : How to convert a native query result set to POJO class collection

在您的情况下,我不明白为什么不能在JPQL查询中使用JPA。

您需要在@ManyToOne

中映射Passenger关系
@ManyToOne
private Plane plane;

并运行此查询:

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

您将只获得与Carlos名称相匹配的乘客,并且您可以访问他们的飞机p.getPlane()