0

如果您有这种类型的 JPA 实体设置,其中包含一个超类和几个子类(见下文),您如何编写一个 JPA 查询来选择每个子类的前 3 个(按创建日期排序)?编写两个单独的查询并要求特定的子类可以正常工作,但如果可能的话,我想将其归结为一个查询。

@MappedSuperclass
public class Parent {
    @Temporal(TIMESTAMP)
    @Column(name = "created")
    private Date created;
    ...
}

@Entity
@DiscriminatorValue("A")
public class ChildA extends Parent {
    ...
}

@Entity
@DiscriminatorValue("B")
public class ChildB extends Parent {
    ...
}
4

2 回答 2

2

您不能将 @MappedSuperclass 用于此用例(JPA 规范):

与实体不同,映射的超类是不可查询的,并且不能作为参数传递给 EntityManager 或 Query 操作。

因此,将您的超类转换为抽象实体:

@Entity
@Inheritance(strategy=SINGLE_TABLE)
@NamedQuery(name="queryName", query="SELECT p FROM Parent p ORDER BY p.createdDate DESC, DTYPE(p) ASC")
public abstract class Parent {

  @Temporal(TIMESTAMP)
  private Calendar createdDate;
}
于 2014-09-23T14:34:18.493 回答
0

要实现继承,您可以使用@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 与鉴别器列...

@MappedSuperclass:“......指定一个类,其映射信息应用于从它继承的实体......”

http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html_single/#mapping-declaration

完成此操作后,您可以简单地进行查询,如SELECT p from Parent p order by p.created...

于 2014-09-23T09:40:16.237 回答