我正在尝试创建一个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和实体(Hibernate(列表的isMember,但我还没能从那里收集到太多信息。
一个解决方案会很好,但也有一个指向文档的指针,其中也指定了这一点。我的谷歌傅让我失望了。
我在这里发现了一个非常相似的问题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)
);
};
}