2

如果我有这样的事情

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

2 回答 2

5

在使用 JPQL 时,您需要停止思考外键并开始思考对象。让我们仔细看看:

select c from Facility c where c.CUSTOMER_FK=:customer_fk

FacilityCUSTOMER_FK房产吗?不,所以上面的查询是不正确的。下一个:

select c from Facility c where c.customer=:customer_fk

从语法上讲,这个是正确的。但你仍然没有思考对象。在这里,查询希望您传递一个客户实例,而不是 FK。因此我会像这样重写它(它相同的查询,但它更好地传达了 IMO 的意图,我实际上会避免任何foo_fk约定,你并没有真正使用 JPA 操作 FK):

select c from Facility c where c.customer = :customer

如果您真的想通过 id 查找,您应该浏览关联并编写:

select c from Facility c where c.customer.id = :id
于 2010-06-28T19:12:32.623 回答
1

在 JPQL 中,您使用属性的名称,而不是数据库列。所以 - 第一个选项。

但是当你传递参数时,传递的是整个对象,而不是它们的 ID。在你的情况下,你要么传递一个Customer实例,要么让 where 子句寻找c.customer.id(你最好命名为 alias f,而不是c

于 2010-06-28T18:54:10.907 回答