2015-06-04 65 views
0

我正在使用JPA(引擎盖下有hibernate),并且希望选出一组汇总一组真实实体的数据,例如一个名称,一个父实体的名称以及具有该名称的实例的计数。JPA概要实体或元实体

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

我想检索所有类别的列表,并显示父类别的类别名称,类别名称以及该类别内的门票计数。

我可以选择所有的票据并将它们推入哈希集中,按类别键入,但这样做效率很低。理想情况下,我想要做的是选择一个全新实体的列表,它不支持任何数据库表格,但包含一个MetaCategory,一个类别和一个门票计数的整数...

这可能使用JPA,特别是使用CriteriaBuilder?我只需要手动选择东西吗?

回答

2

如果你绝对需要使用标准的查询,你可以使用标准构造函数做到这一点,选择的项目看CriteriaQuer#multiSelect

你将不得不使用选择你感兴趣的 具体列,并得到一个元组或查询返回的对象数组。

例如,对于一个元组这将是类似的东西(在所有未测试):

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(); 
0

使用Hibernate可以创建数据库视图或子查询。视图将被视为一张表格。要使用annotaions定义一个子查询,试试这个:

@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拍摄。