【问题标题】:Construct JPA query for a OneToMany relation为 OneToMany 关系构造 JPA 查询
【发布时间】:2011-07-03 17:59:07
【问题描述】:

我有这两个实体

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

Class B {

    @ManyToOne
    private A a;

    private String name;
}

1) 我想构建一个查询,表示获取所有 A 至少有一个 B 名称为 ="mohamede1945"

2) 我想构建一个查询,表示获取所有没有名称为“mohamede1945”的 B 的 A

谁能帮帮我?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 非常感谢。第一个查询对我来说很好。我之前已经尝试过,但没有成功。
    • SELECT a FROM A a JOIN a.b b WHERE b.name :name 不起作用
    • 感谢您的帮助我已经使用了来自rationalSpring 的建议,它现在可以正常工作。非常感谢
    【解决方案2】:

    您可以使用 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)
    
    猜你喜欢
    • 2014-07-30
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    相关资源
    最近更新 更多