Создайте запрос JPA для отношения OneToMany - PullRequest
7 голосов
/ 03 июля 2011

У меня есть эти 2 объекта

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

Class B {

    @ManyToOne
    private A a;

    private String name;
}

1) Я хотел бы создать запрос, который говорит, что получить все A, которые имеют по крайней мере один B с именем = "mohamede1945"

2) Я хотел бы построить запрос, который говорит, получить все A, которые не имеют B с именем = "mohamede1945"

Может ли кто-нибудь мне помочь?

Ответы [ 2 ]

12 голосов
/ 03 июля 2011

Прежде всего, я думаю, что вы можете узнать ответ, перейдя по этой ссылке и выполнив поиск JOIN: http://download.oracle.com/docs/cd/E11035_01/kodo41/full/html/ejb3_langref.html

Во-вторых, вот мой подход:

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

В вашем DAO вы можете сделать именованный запрос следующим образом:

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;
    }
}
11 голосов
/ 03 июля 2011

Вы можете использовать ЛЮБЫЕ и ВСЕ конструкции для фильтрации подзапроса. Так что-то вроде

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...