创建谓词以将实体与映射中的条目匹配 属性
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)
);
};
}
我正在尝试创建一个 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)
);
};
}