Наследование JPA - как выбрать 3 объекта каждого дочернего типа?

Если у вас есть этот тип установки объекта 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 {
    ...
}

person SergeyB    schedule 22.09.2014    source источник


Ответы (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;
}
person maress    schedule 23.09.2014

Чтобы добиться наследования, вы можете использовать @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...

person ramdane.i    schedule 23.09.2014