我有@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”的乘客,但是在每个飞机物体内部列表包含所有乘客的列表,但我希望此列表中只有乘客称为'卡洛斯。有没有办法做到这一点?
答案 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()
。