构建JPA查询以处理OneToMany关系

9
我有这两个实体。
Class A {
    @OneToMany(mappedBy="a")
    private List<B> bs;
}

Class B {

    @ManyToOne
    private A a;

    private String name;
}

1) 我想构建一个查询,获取所有至少有一个名为"mohamede1945"的B的A。

2) 我想构建一个查询,获取所有没有任何名为"mohamede1945"的B的A。

有人能帮忙吗?

2个回答

13

首先,我认为您可以通过查看此链接并搜索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;
    }
}

非常感谢。第一个查询对我来说很好用。我之前已经尝试过这个了,但是没有起作用。 - mohamede1945
SELECT a FROM A a JOIN a.b b WHERE b.name <> :name 不起作用。 - mohamede1945
谢谢你的帮助,我使用了rationalSpring关于Any和All的建议,现在它已经可以正常工作了。非常感谢您。 - mohamede1945

12
您可以使用 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)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接