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

Create a Predicate to match an entity with an entry in a Map property

我正在尝试创建一个 javax.persistence.criteria.Predicate 来匹配 Map<String,String> 属性 中包含特定 key/value 条目的实体。这是在 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 让我失望了。

我在这里 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)
    );
  };
}