创建谓词以将实体与 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 属性中的条目匹配的主要内容,如果未能解决你的问题,请参考以下文章