2013-10-15 70 views
3

我有以下實體:標準API - 多選 - 元組包含其他元組/收藏

class Person { 
    int id; 
    String name; 
    List<Address> addresses 
} 

class Address { 
    int id; 
    String city; 
} 

我嘗試準備查詢(基於標準的API),其中的結果(在結果列表中的每個元組)將包含三個要素:

  1. persron.id
  2. PERSON.NAME
  3. person.addresses < - 收集與0或多個元素

(1, 「彼得」,集合{2,3})或 (1, 「彼得」,元組{2,3})

我已經試過這樣的事情:

EntityManager em; 
CriteriaBuilder qb = em.getCriteriaBuilder(); 

CriteriaQuery<Tuple> cq = qb.createTupleQuery() 
Root<Person> root = cq.from(Person.class); 

ListJoin<PersonalData, Address> join = (ListJoin)root.join("addresses", JoinType.LEFT); 

cq.multiselect(root.get("id"), root.get("name"), join.get("id")); 

TypedQuery<Tuple> tq = em.createQuery(cq); 
List<Tuple> result = tq.getResultList(); 

但接收到的結果是,預期:(

對於模型不同:人(1, 「彼得」)

其中有兩個地址

地址(2,「London」); 地址(3,「Paris」);

我的結果列表是像笛卡爾乘積:

(1, 「彼得」,2),(1, 「彼得」,3)

是可以接受其請求的結果這篇文章的開頭?

回答

1

不,它無法按照您期望的方式工作,因爲人與地址之間的連接將導致每行有一個地址,並且JPA將以類似的格式返回數據。一個person.id,person.name,person.address在每個元組中。爲什麼不只是返回Person實例並使用它呢?

+1

我的域實體包含一些不應該暴露給其他系統組件的邏輯。因此我嘗試生成類似動態DTO的東西。想要了解數據模型的每個組件都可以調用方法,該方法將返回有關所選實體的選定信息。 – user2808522

+0

好像你有一個完美的對象模型,可以被用來代表你的數據而不是專門用於一個目的的業務邏輯。無論如何,雖然它不是您想要的答案,但我認爲您不會找到使用JPA查詢的方式來獲取不帶返回實體的集合集合。 – Chris

+0

很明顯,商業模式並不好,但我無法改變它。應用程序是巨大的,這是我試圖圍繞此模型分離模型和組件的原因。我想到的第一個想法就是在我的模型的頂部準備DTO。似乎使用標準API的方法不能解決我的問題。我會嘗試使用JPA查詢。感謝您的迴應傢伙。 – user2808522

相關問題