【问题标题】:JPA JPQL nested select statementJPA JPQL 嵌套选择语句
【发布时间】:2021-04-07 09:57:19
【问题描述】:

我有一个非常简单的连接表,关联两个表,为了简化问题,我们可以说 table1 是 A,表 2 是 B,连接表 AB。

A AB B
A_id AB_id B_id
A_details A_id_fk B_details
B_id_fk

其中 A_id_fk 和 B_id_fk 分别是外键。我试图创建一个查询来检索与 B 有关系的 A 的所有行。所以我的函数接收 B_id 作为参数,我想搜索 AB 以获取 B_id_fk == b_id 的所有行,然后使用搜索 A A_id == 先前搜索返回的 A_id_fk 的所有行。

我测试过,它可以使用这样的嵌套选择在纯 SQL 中完成:

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_id.fk 错误,是否有办法将 B.class 嵌套在 A.class 中?我不确定我应该在这里做什么。

【问题讨论】:

  • select i from A i join i.ab ii where ii.b = :B_ID ?
  • @JorgeCampos 它不起作用,你说的 i.ab 是什么意思?是 。一个左括号?
  • SELECT A_details FROM A JOIN AB ON A_id = A_id_fk WHERE B_id_fk = :B_ID
  • 不需要结构AB_id 的提示AB 可以将(A_id_fk, B_id_fk) 作为联合主键。特殊情况可能另有规定,但这是连接表的一般规则。
  • @danblack 是的,我尝试制作复合键 2 天并放弃了。如果你不介意你能不能把它写成 JPQL 格式,我很难把它翻译成 JPQL。

标签: java mysql hibernate jpa jpql


【解决方案1】:

这是最终的工作:

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

【讨论】:

    【解决方案2】:

    根据您的查询,我假设您直接映射了实体(AA_idA_details 字段、BB_idB_details 字段和 AB 与 @987654328 @、A_id_fkB_id_fk)。

    我进行了测试,您的查询(您在此处编写的方式)按预期工作。

    unable to resolve z.A_id.fk 建议您在原始代码中有错字(A_id.fk 而不是 A_id_fk)。

    如果您有不同的模型,请在此处包含您的实体模型以及完整的例外情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-04
      • 2011-06-05
      相关资源
      最近更新 更多