Primefaces懒加载Datatable使用FilterMeta如何实现不等于条件过滤?
PrimeFaces 懒加载DataTable不等于过滤解决方案
方案1:升级到PrimeFaces 12及以上版本(最优解)
PrimeFaces 12版本已经官方扩展了MatchMode枚举,新增了包括不等于在内的多个取反匹配规则,直接原生支持你的需求:
- 新增枚举值包括
NOT_EQUALS、NOT_CONTAINS、NOT_STARTS_WITH、NOT_ENDS_WITH、NOT_IN等
使用示例:
FilterMeta fm = FilterMeta.builder() .field("status") .filterValue(CustomerStatus.NEW) .matchMode(MatchMode.NOT_EQUALS) .build();
你不需要做任何额外逻辑适配,默认的查询构造逻辑会自动生成不等于的条件。
方案2:低版本PrimeFaces自定义匹配模式
如果你的项目无法升级PrimeFaces版本,可以通过自定义匹配模式实现需求,步骤如下:
- 先自定义你的匹配模式常量,你可以直接用字符串标识,不需要修改官方枚举:
// 自定义不等于匹配模式标识 public static final String CUSTOM_NOT_EQUALS = "NOT_EQUALS";
- 构造
FilterMeta时使用matchMode方法传入自定义字符串:
FilterMeta fm = FilterMeta.builder() .field("status") .filterValue(CustomerStatus.NEW) .matchMode(CUSTOM_NOT_EQUALS) .build();
- 在你重写的
LazyDataModel.load()方法中,遍历FilterMeta列表时单独处理自定义匹配模式:
这里以JPA CriteriaBuilder构造查询为例,你可以根据自己的持久层框架调整
for (FilterMeta filter : filters.values()) { String field = filter.getField(); Object value = filter.getFilterValue(); String matchMode = filter.getMatchMode().name(); if (CUSTOM_NOT_EQUALS.equals(matchMode)) { predicates.add(cb.notEqual(root.get(field), value)); continue; } // 原有其他匹配模式的处理逻辑 }
方案3:扩展LazyDataModel增加取反标记
如果需要更灵活的通用取反能力,你可以扩展官方的LazyDataModel,增加一个Set<String> negatedFields属性,标记哪些字段的过滤条件需要取反,在构造查询时统一处理即可,不需要修改FilterMeta的构造逻辑。
另外你之前拼接大于小于的方式存在很大局限性:无法处理字符串、枚举、空值等场景,不建议继续使用。
内容的提问来源于stack exchange,提问作者jesjimher
相关产品推荐
相关产品推荐

