2015-06-04 70 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拍攝。