有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JPA查询,具有2个内部联接和基于其中一个联接对象的排序

我正在创建一个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;
}

我想检索所有成员,留下加入帐户,并邀请和排序的电子邮件地址。如果我写这样一个查询:

@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: ERROR: column "emailaddress" does not exist Hint: Perhaps you meant to reference the column "invite1_.email_address" or the column "account2_.email_address".

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

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


共 (1) 个答案

  1. # 1 楼答案

    您可以使用SQLs coalesce函数,该函数应该在JPA>=2.0中得到支持。 e、 g

    @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"
    )