我需要将映射作为
类似这样的事情:
@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 查询。 我不想在循环中运行单个查询,而是寻找一个可以以列表形式给出结果的单个查询。
最佳答案
我认为使用 @Query 表示法不可能做到这一点,但是,就像 Chris 在评论中所说的那样,您可以很快编写一些代码来使用条件查询动态创建此类语句。
我认为您正在寻找的代码是这样的,其中提供的 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();
}
生成的查询应该包含您想要的 AND 和 OR 语句的组合,即
SELECT * FROM member WHERE ((name = ? AND relationName = ?) OR (name = ? AND relationName = ?) ... etc)
注意:
自 Map
只能包含一次 key ,您可以考虑使用 List<KeyValue<String, String>>
或List<Pair<String, String>>
反而。 KeyValue 和 Pair 都可以在 Apache commons 库中找到,我相信 Spring 也包含 Pair 实现。或者您可以自己编写。
关于java - 如何将 Map 或 List<Object> 作为参数传递给 JPA 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71484237/