我知道entityManager.find()方法可用於使用主鍵獲取一行。JPA使用where子句選擇行
但我有一個要求來定義一個普通的查找方法,它接受具有where子句條件的地圖。在映射中,鍵將是列名,值將是where子句的列名值。此方法應返回選定行的列表。
有人可以幫我嗎?
我知道entityManager.find()方法可用於使用主鍵獲取一行。JPA使用where子句選擇行
但我有一個要求來定義一個普通的查找方法,它接受具有where子句條件的地圖。在映射中,鍵將是列名,值將是where子句的列名值。此方法應返回選定行的列表。
有人可以幫我嗎?
找到取主行的方向。現在如你所願 「」通用的查找方法,它接受具有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閱讀。
我想我應該通過CriteriaBuilder來做到這一點,謝謝 – Ani
看一看:EntityManager.createQuery。如果我正確理解你的問題,這將允許你創建你想要執行的查詢。你也可以看看使用CriteriaBuilder。
以下可能是矯枉過正,但是使用criteriaBuilder來處理它是一種相當通用的方法。雖然我無法將代碼粘貼到此處(工作),但我創建了一個抽象BaseFilter <實體>類。
那麼容易的部分是讓實現對象提供getXX,setXX屬性。然後添加getPredicates()以返回謂詞的ArrayList,然後抽象BaseDAO可以調用它來執行查詢。
我們專門爲getXX和setXXX工作,所以我們可以通過get(Entity1_.childObject).get(ChildObject_.grandChildObject)來引用元素以協助重構。 JPA也通過字符串名稱支持它,所以你可以用它來實現getPredicates。
JPA在其調用中需要實際的Entity.class引用,試圖獲得它有點有趣。最終谷歌搜索轉向了它。
您擁有哪個JPA版本? – VibrantVivek