如果我有这样的东西
@Entity
public class Facility {
...
@ManyToOne
@JoinColumn(name="CUSTOMER_FK")
private Customer customer;
...
}
我的@NameQuery
喜欢这个
@NamedQuery(name="Facility.findByCustomerId", query="select c from Facility c where c.customer=:customer_fk")
或者像这样
@NamedQuery(name="Facility.findByCustomerId", query="select c from Facility c where c.CUSTOMER_FK=:customer_fk")
答案 0 :(得分:5)
在使用JPQL时,您需要停止考虑外键并开始思考对象。让我们仔细看看:
select c from Facility c where c.CUSTOMER_FK=:customer_fk
您的Facility
是否拥有CUSTOMER_FK
财产?不,所以上面的查询不正确。下一个:
select c from Facility c where c.customer=:customer_fk
从句法上讲,这个是正确的。但你仍然没有想到对象。在这里,查询希望您传递客户实例,而不是FK。因此我会像这样重写它(是相同的查询,但它更好地传达了IMO的意图,我实际上避免了任何foo_fk
约定,你并没有真正操纵FK与JPA):
select c from Facility c where c.customer = :customer
如果你真的想通过id找到,你应该浏览关联并写下:
select c from Facility c where c.customer.id = :id
答案 1 :(得分:1)
在JPQL中,您使用属性的名称,而不是数据库列。所以 - 第一个选择。
但是当你传递参数时,你会传递整个对象,而不是它们的ID。在您的情况下,您要么传递Customer
实例,要么将where子句查找c.customer.id
(并且您最好将别名命名为f
,而不是c
)< / p>