JPA 摘要实体或元实体

JPA Summary entity or meta entity

我正在使用 JPA(在引擎盖下使用 hibernate)并希望 select 输出一堆数据来总结一组真实的实体,例如一个名称,一个父实体的名称以及具有该名称的实例数。

在我完全虚构的示例中,让我们有一个名为 Ticket 的实体,它有一个名为 Category 的父实体,它本身有一个名为 MetaCategory 的父实体。

我想检索所有类别的列表,并显示父元类别名称、类别名称和该类别中的票数。

我可以 select 所有票并将它们推入一个哈希集中,按类别键控,但感觉效率很低。我最想做的是 select 列出一个全新实体的列表,该实体不受任何数据库 table 支持,但包含一个 MetaCategory、一个类别和一个整数门票...

是否可以使用 JPA,特别是使用 CriteriaBuilder?我只需要 select 手动解决问题吗?

使用 Hibernate,您可以创建数据库视图或子选择。视图将被视为 table。要使用注释定义子选择,试试这个:

@Entity
@Subselect("select item.name, max(bid.amount), count(*) "
    + "from item "
    + "join bid on bid.item_id = item.id "
    + "group by item.name")
@Synchronize( {"item", "bid"} ) //tables impacted
public class Summary {
   @Id
   public String getId() { return id; }
   ...
}

摘自 docs

如果您确实需要使用条件查询,可以使用条件构造函数和选择项来实现,请参阅 CriteriaQuer#multiSelect

您必须使用 select 您感兴趣的特定列 并从查询中获取元组或对象数组。

例如,对于一个元组,它会是这样的(根本没有测试):

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Tuple> query = cb.createQuery(Integer.class);

Root<Category> r = query.from(Category.class);
Join<Category, Ticket> jT = r.join("tickets")
query.multiselect
(
 cb.construct(A.class, root.get("property1"), root.get("property2"),
 cb.construct(Ticket.class, jT.get("..."))
);
List<Tuple> result = query.getResultList();