Spring 规格 'and' 不工作
Spring specifications 'and' not working
您好!
我正在尝试在 运行 时间为数据网格构建自定义过滤器。
我正在使用 spring boot 和 vaadin 8 进行数据展示。
Vaadin知识与本题无关。
我最近怎么样:
我为过滤器构建了一个哈希图。
private HashMap<String, Specification<ARInteraction>> interactionSpecifications =
new HashMap<>();
每个过滤器文本字段向地图添加或删除规范:
TextField filterOwner = new TextField("Filter");
filterOwner.addValueChangeListener(nv -> {
if (StringUtils.isNotEmpty(nv.getValue())) {
interactionSpecifications.put("owner", ARInteractionSpecifications
.withOwnerEmail(nv.getValue()));
} else {
interactionSpecifications.remove("owner");
}
refreshContent();
});
当字段数据发生变化时,将在规范映射中添加或替换(或删除)自定义规范。
然后我调用刷新数据视图内容,导致查询取数据为运行。
为了构建查询数据的规范,我只是通过在它们之间应用 'and' 操作来添加所有规范。
private Specification<ARInteraction> buildSpecification() {
// No specs
if (interactionSpecifications.isEmpty())
return null;
// Assembles all specs together
Specification<ARInteraction> ret = null;
for (Specification<ARInteraction> spec : interactionSpecifications.values()) {
if (ret == null) {
ret = Specification.where(spec);
} else {
ret.and(spec);
}
}
return ret;
}
我期望发生的事情是,在应用两个过滤器的情况下,仅获取符合两个规范的实体。
实际发生的事情是,如果我单独设置状态规范(此处未显示)它有效,如果我设置所有者电子邮件过滤器它也有效,但如果我设置两者都显示来自该所有者的所有互动忽略状态过滤器。
你好吗?
规范行为是不可变的,因此您应该使用 and 操作分配 ret 规范。
初学者错误。
for (Specification<ARInteraction> spec : interactionSpecifications.values()) {
if (ret == null) {
ret = Specification.where(spec);
} else {
ret = ret.and(spec); //Assign the ret so that specs are actually added.
}
}
您好! 我正在尝试在 运行 时间为数据网格构建自定义过滤器。 我正在使用 spring boot 和 vaadin 8 进行数据展示。 Vaadin知识与本题无关。
我最近怎么样: 我为过滤器构建了一个哈希图。
private HashMap<String, Specification<ARInteraction>> interactionSpecifications =
new HashMap<>();
每个过滤器文本字段向地图添加或删除规范:
TextField filterOwner = new TextField("Filter");
filterOwner.addValueChangeListener(nv -> {
if (StringUtils.isNotEmpty(nv.getValue())) {
interactionSpecifications.put("owner", ARInteractionSpecifications
.withOwnerEmail(nv.getValue()));
} else {
interactionSpecifications.remove("owner");
}
refreshContent();
});
当字段数据发生变化时,将在规范映射中添加或替换(或删除)自定义规范。
然后我调用刷新数据视图内容,导致查询取数据为运行。
为了构建查询数据的规范,我只是通过在它们之间应用 'and' 操作来添加所有规范。
private Specification<ARInteraction> buildSpecification() {
// No specs
if (interactionSpecifications.isEmpty())
return null;
// Assembles all specs together
Specification<ARInteraction> ret = null;
for (Specification<ARInteraction> spec : interactionSpecifications.values()) {
if (ret == null) {
ret = Specification.where(spec);
} else {
ret.and(spec);
}
}
return ret;
}
我期望发生的事情是,在应用两个过滤器的情况下,仅获取符合两个规范的实体。
实际发生的事情是,如果我单独设置状态规范(此处未显示)它有效,如果我设置所有者电子邮件过滤器它也有效,但如果我设置两者都显示来自该所有者的所有互动忽略状态过滤器。
你好吗?
规范行为是不可变的,因此您应该使用 and 操作分配 ret 规范。 初学者错误。
for (Specification<ARInteraction> spec : interactionSpecifications.values()) {
if (ret == null) {
ret = Specification.where(spec);
} else {
ret = ret.and(spec); //Assign the ret so that specs are actually added.
}
}