创建谓词以将实体与 Map 属性中的条目匹配

Posted

技术标签:

【中文标题】创建谓词以将实体与 Map 属性中的条目匹配【英文标题】:Create a Predicate to match an entity with an entry in a Map property 【发布时间】:2020-09-11 12:48:16 【问题描述】:

我正在尝试创建一个javax.persistence.criteria.Predicate 来匹配在Map<String,String> 属性中包含某个键/值条目的实体。这是在 Spring Data JPA 和 JpaSpecificationExecutor<MyEntity> 存储库的上下文中。

class MyEntity 
  @ElementCollection(fetch = FetchType.EAGER)
  ...
  Map<String, String> metadata = new HashMap<>();


static Specification<MyEntity> hasMetadata(String name, String value) 
  return (entity, criteriaQuery, criteriaBuilder) -> 
    Path<Map<String,String>> metadata = entity.get("metadata");

    // fixme: insert magic
    //
    // not quite right: cb.isMember(cb.literal(value), metadata) 

    return ...
  ;

有一个稍微相关的问题CriteriaBuilder and isMember of list on entity (Hibernate),但我无法从那里收集到太多信息。

一个解决方案会很好,但也是一个指向指定文档的指针。我的 Google-fu 让我失望了。

【问题讨论】:

【参考方案1】:

我在这里jpa criteriabuilder join maps 发现了一个非常相似的问题,它提供了一些现在似乎可以工作的东西

static Specification<MyEntity> hasMetadata(String name, String value) 
  return (entity, criteriaQuery, criteriaBuilder) -> 
    MapJoin<MyEntity, String, String> join = entity.joinMap("metadata");
    return criteriaBuilder.and(
      criteriaBuilder.equal(join.key(), name),
      criteriaBuilder.equal(join.value(), value)
    );
  ;

【讨论】:

以上是关于创建谓词以将实体与 Map 属性中的条目匹配的主要内容,如果未能解决你的问题,请参考以下文章

如何使用实体框架获取记录计数匹配谓词

为啥我的子查询谓词中的 LIKE[c] 与此名称不匹配?

在 Core Data 可转换字符串数组上返回匹配项的 Swift 谓词

断言每个对象属性都匹配 kotlin 测试中的给定谓词

iOS:检查值是不是与核心数据中实体的任何属性匹配?

核心数据谓词根据关系获取数据,错误为无法解析格式字符串