为OneToMany关系构造JPA查询

时间:2011-07-03 17:59:07

标签: jpa one-to-many many-to-one construct

我有那两个实体

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 个答案:

答案 0 :(得分:12)

首先,我认为您可以通过查看此链接并搜索加入来了解答案: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中,你可以像这样命名为named:

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;
    }
}

答案 1 :(得分:11)

您可以使用ANY和ALL构造来过滤子查询。像

这样的东西
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)