有什么方法可以通过过滤键获取列实例吗?假设你有
<p:column headerText="Something" filterBy="#{car.id}" filterMatchMode="contains">
通过调用DataTable#getFilters()
,您将获得包含条目{id=...}
的映射,其中id
是变量的属性名称。如何通过属性名称(在这种情况下,通过id
)获得列?
动机
从提供的过滤器构建sql查询,其中需要提供filterMatchMode
以便为给定条件编写正确的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”)。