2011-07-03 7 views
6

mam te 2 podmiotyConstruct WZP zapytanie o OneToMany stosunku

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

Class B { 

    @ManyToOne 
    private A a; 

    private String name; 
} 

1) Chciałbym skonstruować kwerendę, która mówi się wszystkim, że mają co najmniej jedno B z name = „mohamede1945”

2) Chciałbym skonstruować kwerendę, która mówi dostać wszystko, że nie ma żadnych B z name = „mohamede1945”

czy ktoś może mi pomóc?

+0

nie moje rozwiązanie odpowiedź na pytanie? –

+0

Tak, dziękuję! – mohamede1945

Odpowiedz

9

Można użyć konstrukcji ANY i ALL, aby przefiltrować podzapytanie. Więc coś

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

Przede wszystkim, myślę, że można dowiedzieć się odpowiedź, patrząc na ten link i sprawdzić JOIN: http://download.oracle.com/docs/cd/E11035_01/kodo41/full/html/ejb3_langref.html

drugie, tutaj jest moje podejście:

@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 */ } 

W tobie DAO można dokonać namedquery takiego:

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

Wielkie dzięki. Pierwsze zapytanie działa dobrze ze mną. Próbowałem już tego już wcześniej i nie działało. – mohamede1945

+0

Drugi nie działa? A może masz na myśli dzieła? – illEatYourPuppies

+0

WYBIERZ Z POŁĄCZENIA ab b GDZIE b.nazwa <>: nazwa nie działa – mohamede1945