1

有什么方法可以通过过滤键获取列实例?假设你有

<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”)。

4

0 回答 0