首页 > 解决方案 > 具有 2 个内部连接和基于任一连接对象的排序的 JPA 查询

问题描述

我正在创建一个 JPA 查询,我想在其中对电子邮件地址进行排序。我要查询的表是成员表。该会员可以指向帐户或邀请。可以通过 MemberStatus 枚举查看这些关联之一是否已填充。

@Entity
public class Member {
    @JoinColumn @ManyToOne private Account account;
    @JoinColumn @OneToOne private Invite invite;
    @Enumerated private MemberStatus status; //value can be INVITED or JOINED
}

因此,Account 和 Invite 都包含一个名为 emailAddress 的字符串字段。对于这个问题的意图,考虑它们看起来像这样:

@Entity
public class Account/Invite {
    private String emailAddress;
}

我想检索所有成员,在 Account 和 Invite 上留下加入并在 emailAddress 上排序。如果我写这样的查询:

@NamedQuery(
    name="findMembers",
    query="select m from Member m
        left join m.invite i
        left join m.account a
        order by emailAddress asc"
)

然后我得到一个例外说:

org.postgresql.util.PSQLException: 错误: 列“emailaddress”不存在 提示:也许您的意思是引用列“invite1_.email_address”或列“account2_.email_address”。

这当然是有道理的。但是有没有办法根据存在的左连接表向这个 emailAddress 字段添加一些别名?这在 SQL 中是否可能,更不用说 JPA 了?从数据库的角度来看,我不确定它是如何工作的。

顺便说一句,我不想​​进入数据库继承的方向,这两个引用的实体都有 emailAddress 字段。与好处相比,这有太多的缺点。

标签: javahibernatejpaspring-data-jpa

解决方案


您可以使用coalesce应该在JPA>=2.0. 例如

@NamedQuery(
name="findMembers",
query="select m from Member m
    left join m.invite i
    left join m.account a
    order by coalesce(i.emailAddress, a.emailAddress) asc"
)

推荐阅读