2010-06-28 7 views
2

Si j'ai quelque chose comme çaQuestion sur JPQL, @NamedQuery

@Entity 
public class Facility { 
    ... 
    @ManyToOne 
    @JoinColumn(name="CUSTOMER_FK") 
    private Customer customer; 
    ... 
} 

fait mon @NameQuery comme celui-ci

@NamedQuery(name="Facility.findByCustomerId", query="select c from Facility c where c.customer=:customer_fk") 

ou comme celui-ci

@NamedQuery(name="Facility.findByCustomerId", query="select c from Facility c where c.CUSTOMER_FK=:customer_fk") 

Répondre

5

Vous devez arrêter de penser les clés étrangères et de commencer à penser objet lorsque en utilisant JPQL. Jetons un coup d'oeil de plus près:

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

Est-ce que votre Facility ont une propriété CUSTOMER_FK? Non, donc la requête ci-dessus est incorrecte. Le suivant:

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

Syntaxiquement, celui-ci est correct. Mais vous ne pensez toujours pas à l'objet. Ici, la requête s'attend à ce que vous transmettiez une instance du client, pas un FK. Je donc réécris comme ça (il est la même requête, mais il communique l'OMI l'intention beaucoup mieux et je voudrais vraiment éviter toute convention foo_fk, vous ne manipulez pas vraiment FK avec JPA):

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

et si vous voulez vraiment trouver par identifiant, vous devez naviguer dans l'association et écrire:

select c from Facility c where c.customer.id = :id 
+0

beaucoup mieux comprendre après avoir vu votre poste. TYVM –

+0

@Harry De rien, je suis content que ce fut utile. –

+0

J'espère que ça ira si je pose une autre question. si je le fais ', sélectionnez c de Facility c où c.customer.id = '1'" '.Puis j'ai obtenu ce que je veux, mais si je le fais', sélectionnez c de Facility c où c.customer.id =: id ', puis dans mon Enterprise Bean.Je fais' Query query.setParameter ("id", "1") 'alors je ne reçois rien.Toute idée pourquoi? –

1

Dans JPQL vous utilisez les noms des propriétés, pas les colonnes de la base de données. Donc - la première option. Mais lorsque vous transmettez des paramètres, vous passez tous les objets, pas leurs ID. Dans votre cas, soit vous passez une instance Customer, ou faire le regard de la clause where pour c.customer.id (et vous feriez mieux de nommer l'alias f, non c)

+0

lorsque je tente de le faire '@NamedQuery (name = « Facility.findByCustomerId », requête =" select c de Facility c où c.customer = '1' ")'. Je n'ai rien de retour. Est-ce que j'ai fait quelque chose de mal? –

+0

@Harry Pham voir ma mise à jour – Bozho