java - 具有 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 字段。与好处相比,这有太多的缺点。
解决方案
您可以使用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"
)
推荐阅读
- javascript - 使用jquery单击眼睛图标时如何显示和隐藏密码
- php - 如何将值从日期范围选择器传递到 SQL?
- angular - chartjs 高度不跟随父容器
- node.js - Google 2 Factor Authentication with Angular and NodeJS
- javascript - 使用 angularjs 显示/隐藏级联 tr
- javascript - 在页面加载时替换所有 img src - Javascript
- javascript - 如何定义 Django 视图
- events - CreateJS - 为什么调用 mousemove?
- mybatis - MyBatis 3.4.2 如何找到对应版本的MyBatis Generator?
- java - 在 JavaFX 中呈现 TableColumns 的通用方法