有什么方法可以通过过滤键获取列实例?假设你有
<p:column headerText="Something" filterBy="#{car.id}" filterMatchMode="contains">
通过调用DataTable#getFilters()
,您将获得包含条目的映射,{id=...}
其中id
变量的属性名称。如何按属性名称获取列(在这种特殊情况下按id
)?
动机
从filterMatchMode
需要提供的过滤器构建 sql 查询,以便为给定条件编写正确的LIKE
表达式。所以我想得到这些对:
List<WhereFilter> whereFilters = new LinkedList<>();
for (Entry<String,Object> filter : dataTable.getFilters()) {
String propertyName = filter.getKey(); // if value="#{car.id}", then property = "id"
UIColumn c = dataTable.getSomehowColumnByFilterId(propertyName); // HOW?
String matchMode = c.getFilterMatchMode();
whereFilters.add(new WhereFilter(filter, matchMode));
}
String query = buildQuery(whereFilters, SqlDialect.HQL);
可以使用一种解决方案headerText="propertyName"
,既然c.getHeaderText()
匹配filter.getKey()
,我就能找到c.getFilterMatchMode()
。缺点很明显——在元素中硬编码属性名称通常是不好的做法——重命名实体的属性也需要重命名列标题。此外,属性名称不适合显示(“phoneNumber”与“Phone number”)。