JPA Query具有2个内部联接,并且基于其中一个联接对象进行排序

时间:2018-07-19 05:21:37

标签: java hibernate jpa spring-data-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
}

因此,“帐户”和“邀请”都包含一个名为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字段。与收益相比,这有太多的弊端。

1 个答案:

答案 0 :(得分:2)

您可以使用coalesce中应支持的SQL 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"
)