java - 如何将 Map 或 List<Object> 作为参数传递给 JPA 查询

标签 java spring hibernate jpa spring-data-jpa

我需要将映射作为 类型的输入参数或列表传递到两个 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 查询。 我不想在循环中运行单个查询,而是寻找一个可以以列表形式给出结果的单个查询。

最佳答案

我认为使用 @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/

相关文章:

java - 无法从 URL 位置导入 bean 定义 [classpath :applicationContext-core. xml]

mysql - OneToOne Spring JPA MySQL LAZY加载N+1选择

java - 如何在 Olingo 中向元模型添加自定义属性?

java - 无法在 Android Studio 中解析 DefaultHttpClient

java - 为什么以下代码会返回错误消息 The type Person is already Defined.类(class)人员有什么问题?

java - 你能在 Jersey 中有一个可选的 QueryParam 吗?

javascript - 如何将 jQgrid 格式化函数中的对象参数分配给函数?

java - 从 DynamoDB 保存和删除项目时使用 DynamoDBMapperConfig Clobber 或 Update

Java GPA 计算结果问题

java - 无法解析类方言