jpajpql嵌套select语句

f1tvaqid  于 2021-06-15  发布在  Mysql
关注(0)|答案(2)|浏览(413)

我有一个非常简单的连接两个表的表,为了简化问题,我们可以说表1是a,表2是b,有一个连接表ab。
aabba\u idab\u idb\u ida\u细节a\u id\u fkb\u细节b\u id\u fk
其中a_id_fk和b_id_fk分别是外键。我试图创建一个查询来检索a中与b有关系的所有行。因此,我的函数接收b\u id作为参数,我想搜索ab以获得b\u id\u fk==b\u id的所有行,然后使用search a来搜索a\u id==a\u id\u fk从上一次搜索返回的所有行。
我进行了测试,可以在普通sql中使用嵌套的select进行测试,如下所示:

SELECT * 
FROM A 
WHERE A_ID = 
   (SELECT A_id_fk 
   from AB 
   where B_id_fk = B_id);

所以我阅读了jpql的文档:http://openjpa.apache.org/builds/1.2.0/apache-openjpa-1.2.0/docs/manual/jpa_langref.html#jpa_langref_exists 试过这个

@Transactional
    public List<A> getA(int B_id){
        TypedQuery<A> query = em.createQuery("select i from A i where i.A_id = 
            (select z.A_id_fk from AB z where z.B_id_fk = :B_ID)", A.class);
        return query.setParameter("B_ID",B_id).getResultList();
    }

我现在真的迷路了,因为我遵循了文档中给出的示例,但是它给我带来了无法解决z.a\u id.fk错误的问题,有没有办法在a.class中嵌套b.class?我不知道我应该在这里做什么。

yks3o0rb

yks3o0rb1#

以下是最终的效果:

TypedQuery<Promotions> query = em.createQuery("select i from A i inner join AB x on x.A.A_id = i.A_id where x.B.B_id = :B_id", A.class);
jtjikinw

jtjikinw2#

根据您的查询,我假设您直接Map了实体( AA_id , A_details 领域, BB_id , B_details 字段,以及 ABAB_id , A_id_fk , B_id_fk ).
我运行了一个测试,您的查询(您在这里编写的方式)按预期工作。 unable to resolve z.A_id.fk 表明您的原始代码中有一个拼写错误( A_id.fk 而不是 A_id_fk ).
如果您有不同的模型,请在这里包括您的实体模型以及完整的例外情况。

相关问题