我需要將地圖作為 <Sting,String> 或 List 型別的輸入引數傳遞到兩個 JPA 列中,并將結果作為地圖/串列中所有條目的記錄串列。
像這樣的東西:
@Query(
value =
"SELECT e from #{#entityName} e where e.name = KEY(someMap) and e.relationName = VALUE(someMap)")
List<Member> findByNameAndRelationNameIn(
@Param("someMap") Map<String, String> someMap);
要么
@Query(
value =
"SELECT e from #{#entityName} e where e.name IN (:#{#dataSpaceMembers.?[name]}) and e.dataSpaceName IN (:#{#dataSpaceMembers.?[dataSpaceName]})")
List<DataSpaceMember> findByNameAndDataSpaceIn(
@Param("dataSpaceMembers") List<DataSpaceMember> dataSpaceMembers);
但是應用程式沒有運行,因為這不是一個有效的 jpa 查詢。我不想在回圈中運行單個查詢,而是尋找可以將結果作為串列給出的單個查詢。
uj5u.com熱心網友回復:
我認為這不可能使用@Query 表示法,但是,就像克里斯在評論中所說的那樣,您可以很快撰寫一些代碼來使用條件查詢動態創建這種陳述句。
我認為您正在尋找的代碼將是這樣的,其中提供的 Map 是一組鍵/值對,鍵為name,值為relationName。
EntityManager em;
public List<Member> get(Map<String, String> map) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Member> cq = cb.createQuery(Member.class);
Root<Member> root = cq.from(Member.class);
List<Predicate> predicates = new ArrayList<>();
for (Map.Entry<String, String> e : map.entrySet()) {
Predicate a = cb.equal(root.get("name"), e.getKey());
Predicate b = cb.equal(root.get("relationName"), e.getValue());
predicates.add(cb.and(a, b));
}
cq.where(cb.or(predicates.toArray(new Predicate[0])));
return em.createQuery(cq).getResultList();
}
這產生的 Thr 查詢應該具有您想要的 AND 和 OR 陳述句的組合,即
SELECT * FROM member WHERE ((name = ? AND relationName = ?) OR (name = ? AND relationName = ?) ... etc)
筆記:
由于 aMap只能包含一次密鑰,因此您可以考慮使用List<KeyValue<String, String>>orList<Pair<String, String>>代替。KeyValue 和 Pair 都可以在 Apache 公共庫中找到,我相信 Spring 還包括 Pair 實作。或者你可以自己寫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/445639.html
