我正在创建一个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字段。与收益相比,这有太多的弊端。
答案 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"
)