我有以下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'令牌上得到了异常,我知道如果类有关系定义到另一个类,JOIN是可能的,但是这里的关系有点复杂,因为我们有3个用户与一个Message相关。任何想法如何解决这个问题?
答案 0 :(得分:6)
我认为这应该可以解决问题:
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将从中推断出其余部分。映射。
答案 1 :(得分:1)
我正在使用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);