2016-01-24 60 views
4

查询时非法尝试取消引用集合我有2类:使用JPA关系

@Table(name = "PEOPLE") 
@Entity 
class Person { 
    @OneToMany(mappedBy = "owner") 
    Set<Car> cars; 
} 
@Table(name = "CARS") 
@Entity 
class Car { 
    @ManyToOne 
    @JoinColumn(name = "OWNER_ID", referencedColumnName = "ID") 
    Person owner; 
    @Column(name = "MODEL") 
    String model; 
} 

我试图通过模型来查询的人。运行下面的代码失败,即使表之间的连接是清楚的:

select mo from Person mo where mo.cars.model = ? 

的错误是:

org.hibernate.QueryException: illegal attempt to dereference collection [...] with element property reference [model] [select mo from Person mo where mo.cars.model = ?] 

不知道如何解决这个问题?

+0

*顺便说一句,这是一个简单的例子。失败的代码有几个'OneToMany'连接。它更像是一棵树,条件是在一片树叶上。 –

+0

所以请阅读JPA规范或任何JPQL文档,并看到您不能取消引用这样的集合 –

回答

5

当已经定义的实体之间的关系,你可以使用join fetch语法:

select mo from Person mo join fetch mo.cars c where c.model = ? 
4

mo.cars是一组。您无法访问Set的模型属性,因为它没有。您需要加入:

select p from Person p 
inner join p.cars car 
where car.model = :model 

一如既往,the relevant documentation