Вопрос по JPQL, @NamedQuery - PullRequest
2 голосов
/ 28 июня 2010

Если у меня есть что-то вроде этого

@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 ]

5 голосов
/ 28 июня 2010

Вам нужно перестать думать о внешних ключах и начать думать об объекте при использовании 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

И если вы действительно хотите найти по идентификатору, вы должны перейти по ассоциации и написать:

select c from Facility c where c.customer.id = :id
1 голос
/ 28 июня 2010

В JPQL вы используете имена свойств, а не столбцы базы данных. Итак - первый вариант.

Но когда вы передаете параметры, вы передаете целые объекты, а не их идентификаторы. В вашем случае вы либо пропускаете экземпляр Customer, либо заставляете предложение where искать c.customer.id (и вам лучше назвать псевдоним f, а не c)

...