2017-09-14 89 views
0

是否有可能(以及如何)創建一個條件查詢,該條件查詢會生成一個元素或數組,其中某些元素是來自集合值屬性的集合?包含集合值屬性的條件查詢

鑑於其有名稱的List<SubEntities>subs

class Dummy { 
    String name; 
    List<SubEntity> subs; 
} 

class SubEntity { 
    // some attributes 
} 

我希望有一個標準API查詢與結構導致一些

元組>

Array而不是實體DummyTuple會很好,對於ArrayList也是如此。

我嘗試以下:

CriteriaBuilder cb = em.getCriteriaBuilder(); 

CriteriaQuery<Object[]> q = cb.createQuery(Object[].class); 
Root<DummyEntityWithCollection> root = q.from(DummyEntityWithCollection.class); 
Join<Object, Object> subs = root.join("subs"); 
q.select(cb.array(root.get("name"), subs)); 

List<Object[]> list = em.createQuery(q).getResultList(); 

但是包含在listObject[] s與第二元件SubEntity s,而不是List<SubEntity>

以同樣的方式這一次失敗:

CriteriaBuilder cb = em.getCriteriaBuilder(); 

CriteriaQuery<Tuple> q = cb.createTupleQuery(); 
Root<DummyEntityWithCollection> root = q.from(DummyEntityWithCollection.class); 
Join<Object, Object> subs = root.join("subs"); 
q.multiselect(root.get("name"), subs); 

List<Tuple> list = em.createQuery(q).getResultList(); 

這種變異

CriteriaBuilder cb = em.getCriteriaBuilder(); 

CriteriaQuery<Object[]> q = cb.createQuery(Object[].class); 
Root<DummyEntityWithCollection> root = q.from(DummyEntityWithCollection.class); 
q.select(cb.array(root.get("name"), root.get("subs"))); 

List<Object[]> list = em.createQuery(q).getResultList(); 

完全不和導致一個無效的SQL語句單一.作爲一個選擇列工作(至少對於Hibernate和HSQLDB來說)。

問題How can I retrieve a collection property using criteria Api似乎表明,這是不可能的,但它基於Hibernate,我想獲得基於JPA的答案。特別是指出JPA規範部分明確表示不可能的答案,我們將不勝感激。

回答

1

JPQL defines在4.8節作爲

select_clause ::= SELECT [DISTINCT] select_item {, select_item}* 
select_item ::= select_expression [[AS] result_variable] 
select_expression ::= single_valued_path_expression | scalar_expression | aggregate_expression | identification_variable | OBJECT(identification_variable) | constructor_expression 

SELECT子句,所以你可以看到,多值表達式在JPQL選擇。

標準只是一種使用API​​和對象創建查詢的方法。請參閱JPA規範第6.1章:

條件查詢的語義旨在反映Java持久性查詢 語言查詢的語義。

因此,假定相同的約束適用於Criteria API是合理的。

+1

感謝您的指點。我添加了一些明確的參考和鏈接。 –

相關問題