【问题标题】:jpql left join conditionjpql左连接条件
【发布时间】:2015-07-18 12:38:33
【问题描述】:

我没有让那个简单的查询工作,我现在不知道为什么。我有三个实体(只是语义代码):

Profile {
@OneToMany
Set<ProfileClubMapping> clubs
String username
...
}

ProfileClubMapping {
@ManyToOne
Profile profile
@ManyToOne
Club club
...
}

Club {
@OneToMany
Set<ProfileClubMapping> profiles
...
}

现在我想选择每个包含用户名字符串和具有特定俱乐部 ID 的 ProfileClubMapping 的个人资料。如果不存在 ProfileClubMapping,则只为 ProfileClubMapping 返回 null。 我尝试了类似的方法:

SELECT p,pcm FROM Profile p LEFT JOIN p.clubs pcm ON pcm.club.id = :clubId WHERE UPPER(p.username) = UPPER(:str)

但是这个查询只返回我有 ProfileClubMapping 的配置文件。 有人有想法吗?

编辑:也许 sql 查询有帮助:

SELECT p.USERNAME, pcm.CLUB_ID FROM PROFILE AS p LEFT JOIN PROFILECLUBMAPPING AS pcm ON pcm.PROFILE_ID = p.ID AND pcm.CLUB_ID = :clubId WHERE  p.USERNAME LIKE '%:username%';

【问题讨论】:

    标签: eclipselink jpql glassfish-4 java-ee-7


    【解决方案1】:

    我们改为使用 LEFT OUTER JOIN。 join 的行为与普通 SQL 相同。参见示例 -> http://www.w3schools.com/sql/sql_join_left.asp

    【讨论】:

    • 可能是因为您明确查询特定的俱乐部 ID。你应该添加或 pcm IS NULL 或类似的东西。
    • 你将如何完成这样的事情?
    • 类似这样的: select p from Profil p left outer join p.clubs c where UPPER(p.username) = UPPER(:str) and (c.id=:clubId or c.id is空)
    • 很遗憾这不起作用。我在我的帖子中添加了 sql 查询。也许这有帮助?
    • 添加的查询与我发布的内容相去甚远,请详细说明“不起作用”的含义。我知道它可以工作的一个侧节点。我写了一篇关于休眠基础的博客,所以我已经准备好可以使用的代码并对其进行了测试。
    猜你喜欢
    • 2012-10-25
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 2012-09-12
    相关资源
    最近更新 更多