2011-07-03 6 views
6

J'ai ces 2 entitésConstruire requête JPA pour une relation OneToMany

Class A { 
    @OneToMany(mappedBy="a") 
    private List<B> bs; 
} 

Class B { 

    @ManyToOne 
    private A a; 

    private String name; 
} 

1) Je voudrais construire une requête qui dit obtenir tous les A qui ont au moins un B avec name = « mohamede1945 »

2) Je voudrais construire une requête qui dit obtenir tous les a qui n'ont pas de B avec name = « mohamede1945 »

quelqu'un pourrait-il me aider?

+0

ma solution ne répond à votre question? –

+0

Ouais, merci! – mohamede1945

Répondre

9

Vous pouvez utiliser les constructions ANY et ALL pour filtrer la sous-requête. Donc, quelque chose comme

1. FROM A aEntity WHERE 'mohamede1945' = ANY (SELECT bEntity.name FROM aEntity.bs bEntity) 

2. FROM A aEntity WHERE 'mohamede1945' <> ALL (SELECT bEntity.name FROM aEntity.bs bEntity) 
+0

http://download.oracle.com/docs/cd/E11035_01/kodo41/full/html/ejb3_langref.html#ejb3_langref_all_any – illEatYourPuppies

10

D'abord, je pense que vous pouvez apprendre la réponse en regardant ce lien et chercher JOIN: http://download.oracle.com/docs/cd/E11035_01/kodo41/full/html/ejb3_langref.html

Deuxièmement, voici mon approche:

@Entity 
@NamedQueries({ 
@NamedQuery(name="A.hasBName",query="SELECT a FROM A a JOIN a.b b WHERE b.name = :name"), 
@NamedQuery(name="A.dontHasBName",query="SELECT a FROM A a JOIN a.b b WHERE b.name <> :name") 
}) 
Class A { /* as you defined */ } 

En vous OAC, vous pouvez faire le namedquery comme ceci:

public List<A> findByHasBName(String name){ 
    Query q = em.createNamedQuery("A.hasBName") 
      .setParameter("name", name); 
    try{ 
     return ((List<A>) q.getResultList()); 
    } catch (IndexOutOfBoundsException e){ 
     return null; 
    } 
} 
+0

Merci beaucoup. La première requête fonctionne très bien avec moi. J'ai déjà essayé cela déjà et ça ne fonctionnait pas. – mohamede1945

+0

La seconde ne fonctionne pas? Ou lequel voulez-vous dire fonctionne? – illEatYourPuppies

+0

CHOISISSEZ UN FROM A a JOIN ab b O WH b.name <>: nom ne fonctionne pas – mohamede1945

Questions connexes