【问题标题】:JPQL multiple left join with one classJPQL 多个左连接与一个类
【发布时间】:2012-09-12 00:17:28
【问题描述】:

我对 JPQL 有以下问题: 一个类有三个字段:

public class Message{
  Integer ownerId;
  Integer fromUserId;
  Integer toUserId;
  //rest of implementation
}

然后我想通过用户名在数据库中搜索,但我们有 3 个用户附加到此消息:所有者、收件人和发件人,所以我在 SQL 中所做的是:

SELECT * FROM message m 
LEFT JOIN user o ON m.owner_id=o.id 
LEFT JOIN user fu ON m.from_user_id = fu.id
LEFT JOIN user tu ON m.to_user_id = tu.id
WHERE o.name like '%foo%' OR fu.name like '%foo%' OR tu.name like '%foo%';

这可能不是最快的查询,但工作正常。然后我想把它翻译成JPQL,但这并不容易。我在“on”令牌上遇到异常,我知道如果该类定义了与另一个类的关系,则可以加入,但这里的关系有点复杂,因为我们有 3 个用户与一个消息相关。任何想法如何解决这个问题?

【问题讨论】:

    标签: sql spring jpql


    【解决方案1】:

    我认为这应该可以解决问题:

    FROM message m                -- SELECT * is optional in JPQL
    LEFT JOIN m.owner o           -- In JPQL, you put the path to the related object
    LEFT JOIN m.from_user_id fu   -- and JPA does the rest using the mappings
    LEFT JOIN m.to_user_id tu
    WHERE o.name like '%foo%' OR fu.name like '%foo%' OR tu.name like '%foo%';
    

    要记住的是,在 JPQL 中,JOIN 条件是在映射中定义的,因此您无需在查询中指定它们:只需输入您要引用的对象的路径,JPA 将从映射。

    【讨论】:

    • 嗯,这是一个很好的答案,所以我给出 +,但是在我的示例中它不起作用,因为我们没有定义映射,我们只存储没有定义关系的整数.. 但是谢谢!
    • 顺便说一句,只要我正在阅读,如果没有正确的映射,这是不可能做到的,所以这个问题无法解决
    • 如果您正在使用 JPA,映射不是一个选项,您需要它们来做任何有用的事情。
    【解决方案2】:

    我正在使用 Spring Data JPA 版本 2.1.5(2019 年 2 月),并且我有多个左连接正在工作,如下例所示:

    @Query("select parentMenu from ObMenu parentMenu "
                + "left join ObTreeNode parentTreeNode on parentMenu.id=parentTreeNode.nodeId "
                + "left join ObTreeNode childTreeNode on parentTreeNode.nodeId=childTreeNode.parentId "
                + "where  childTreeNode.nodeId=:childMenuId")
        ObMenu findParentMenu(@Param("childMenuId") String childMenuId);   
    

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 2015-05-23
      • 2015-04-04
      • 1970-01-01
      • 2017-10-23
      • 2015-03-04
      • 2015-07-18
      • 2020-05-10
      • 2018-11-01
      相关资源
      最近更新 更多