Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA摘要实体或元实体_Java_Hibernate_Jpa_Criteria Api - Fatal编程技术网

Java JPA摘要实体或元实体

Java JPA摘要实体或元实体,java,hibernate,jpa,criteria-api,Java,Hibernate,Jpa,Criteria Api,我使用的是JPA(隐藏着hibernate),我想选择一组数据来总结一组真实的实体,例如一个名称、一个父实体的名称以及使用该名称的实例数 在我完全虚构的示例中,让我们有一个名为Ticket的实体,它有一个名为Category的父实体,它本身有一个名为MetaCategory的父实体 我想检索所有类别的列表,并显示父元类别名称、类别名称以及该类别中的票证计数 我可以选择所有的票,然后将它们放入一个哈希集中,按类别键入,但这感觉效率很低。理想情况下,我想做的是选择一个全新实体的列表,它不受任何数据库

我使用的是JPA(隐藏着hibernate),我想选择一组数据来总结一组真实的实体,例如一个名称、一个父实体的名称以及使用该名称的实例数

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

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

我可以选择所有的票,然后将它们放入一个哈希集中,按类别键入,但这感觉效率很低。理想情况下,我想做的是选择一个全新实体的列表,它不受任何数据库表的支持,而是包含一个元类别、一个类别和一个票证计数的整数


使用JPA,特别是使用
CriteriaBuilder
,这是否可行?我需要手动选择吗?

使用Hibernate,您可以创建数据库视图或子选择。视图将被视为一个表。要使用注释定义子选择,请尝试以下操作:

@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; }
   ...
}

如。

中所述,如果您确实需要使用条件查询,则可以使用条件构造函数和选择项进行查询,请参阅

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

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

CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery=cb.createQuery(Integer.class);
Root r=query.from(Category.class);
加入jT=r.Join(“票”)
query.multiselect
(
cb.construct(A.class,root.get(“property1”),root.get(“property2”),
cb.construct(Ticket.class,jT.get(“…”))
);
List result=query.getResultList();
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();