【发布时间】:2019-12-07 20:55:59
【问题描述】:
我有 3 个表,例如 alarm、alarmTag 和 alarm_alarmTag。 alarm 和 alarmTag 表具有多对多关系。 alarm_alarmTag 表正在映射 alarm 和 alarmTag 表。
每个警报可以有多个警报标签。例如alarm1 有tag1 和tag2。所以我想创建一个搜索过滤器,当我在该过滤器上选择tag1 时,我想显示具有tag1 的警报。
我已经通过 join 完成了此操作,但问题是当我过滤 tag1 时,它在标签列上仅显示 tag1,但该列上还有其他标签。
过滤前:
+------------------+
| alarm table |
+------------------+
| id | tag |
+------------------+
| 1 | tag1, tag2 |
| 2 | tag3, tag4 |
+------------------+
过滤后tag1:
+------------------+
| alarm table |
+------------------+
| id | tag |
+------------------+
| 1 | tag1 |(this column must also have `tag2`)
+------------------+
型号:
public class ActiveAlarm {
@Id
private Long id;
@ManyToMany(cascade = CascadeType.PERSIST)
private Set<AlarmTag> alarmTag;
}
控制者:
@GetMapping("/active")
public List<ActiveAlarmView> findAll(@RequestParam(required = false, defaultValue = "") List<Long> alarmTag) {
var data = repository.findAll(ActiveAlarmSpecification.filter(alarmTag));
return data.stream().map(record -> ActiveAlarmView.builder()
.id(record.getId())
.alarmTag(record.getAlarmTag()))
.build()).collect(Collectors.toList());
}
过滤器规格:
public class ActiveAlarmSpecification {
/**
* Filter Specification.
*/
public static Specification<ActiveAlarm> filter(List<Long> alarmTag) {
return (root, query, cb) -> {
query.distinct(true);
ArrayList<Predicate> predicates = new ArrayList<>();
if (!alarmTag.isEmpty()) {
//***problem is in this line***
predicates.add(root.join("alarmTag").get("id").in(alarmTag));
}
return cb.and(predicates.toArray(new Predicate[0]));
};
}
}
alarmTag 型号:
public class AlarmTag {
@Id
private Long id;
private String label;
}
这是我的请求链接:http://localhost:8080/api/test/v1/alarm/active?alarmTag=1
【问题讨论】: