关于JPQL,@ NamedQuery的问题

时间:2010-06-28 18:41:53

标签: java jpa java-ee jpql

如果我有这样的东西

@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")

2 个答案:

答案 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>