2014-02-14 72 views
0

我知道entityManager.find()方法可用於使用主鍵獲取一行。JPA使用where子句選擇行

但我有一個要求來定義一個普通的查找方法,它接受具有where子句條件的地圖。在映射中,鍵將是列名,值將是where子句的列名值。此方法應返回選定行的列表。

有人可以幫我嗎?

+0

您擁有哪個JPA版本? – VibrantVivek

回答

3

找到取主行的方向。現在如你所願 「」通用的查找方法,它接受具有where子句條件的地圖。在地圖中,鍵將是列名,值將是列這個方法應該返回所選行的列表「 」,因此您必須像這樣去找CriteriaQuery:

以下簡單的Criteria查詢返回數據源中Pet實體的所有實例:

EntityManager em = ...; 
CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<Pet> cq = cb.createQuery(Pet.class); 
Root<Pet> pet = cq.from(Pet.class); 
cq.select(pet); 
TypedQuery<Pet> q = em.createQuery(cq); 
List<Pet> allPets = q.getResultList(); 

等效JPQL查詢:

SELECT p FROM Pet p 

而且我會建議你去基於註解映射在你的實體&找二傳手& getter是否methods.In該設計還可以通過java的邏輯已經定製方法爲此去here閱讀。

+0

我想我應該通過CriteriaBuilder來做到這一點,謝謝 – Ani

1

以下可能是矯枉過正,但是使用criteriaBuilder來處理它是一種相當通用的方法。雖然我無法將代碼粘貼到此處(工作),但我創建了一個抽象BaseFilter <實體>類。

那麼容易的部分是讓實現對象提供getXX,setXX屬性。然後添加getPredicates()以返回謂詞的ArrayList,然後抽象BaseDAO可以調用它來執行查詢。

我們專門爲getXX和setXXX工作,所以我們可以通過get(Entity1_.childObject).get(ChildObject_.grandChildObject)來引用元素以協助重構。 JPA也通過字符串名稱支持它,所以你可以用它來實現getPredicates。

JPA在其調用中需要實際的Entity.class引用,試圖獲得它有點有趣。最終谷歌搜索轉向了它。