【问题标题】:PrimeFaces, sort p:column based on a property of a propertyPrimeFaces,根据属性的属性对 p:column 进行排序
【发布时间】:2013-07-05 10:25:16
【问题描述】:

我正在开发一个使用 PrimeFaces、Spring 和 Hibernate 的 JSF 2.1 项目。

我有一个名为 Provinces 的实体,它通过 JoinColumn 与一个名为 Region 的实体相关:

@Entity
@Table(name = "PROVINCE")
public class Province  {

    /* ... */        
@ManyToOne
@JoinColumn(name = "ID_REGION",nullable=false)
public Region getRegion() {
    return region;
}

public void setRegion(Region region) {
    this.region = region;
}

@Column(name = "DESCRIPTION", nullable=false)
public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

}


@Entity
@Table(name = "REGION")
public class Region  {

    /* ... */        
@OneToMany(mappedBy = "region")
public List<Province> getProvince() {
    return province;
}

public void setProvince(List<Province> province) {
    this.province = province;
}

@Column(name = "DESCRIPTION", nullable=false)
public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

}

在 JSF 页面上,我有一个 p:dataTable,它显示了省份列表。其中,我有一列显示该省所属地区的名称。 比如:

        <p:dataTable id="provincesDatatable"
        value="#{provinceMB.lazyProvinceViewModel}" 
        var="province"
        paginator="true" rows="15" lazy="true"
        emptyMessage="Nothing to see here, move along"
        paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
        selection="#{admProvinceMB.selectedProvince}" selectionMode="single"
        rowsPerPageTemplate="5,10,15">

        <p:column headerText="Province Name"
            sortBy="#{province.description}">
            <h:outputText value="#{province.description}" />
        </p:column>

        <p:column headerText="Region Name"
            sortBy="#{province.region}">
            <h:outputText value="#{province.region.description}" />
        </p:column>
    </p:dataTable>

(我省略了支持 bean 和 LazyDataModel 实现,因为我认为它们与问题无关,但如果需要我可以展示它们)。 除了按地区排序之外,这很好用。

上面的例子是按地区id排序,而我想按地区描述排序,像下面这样,不起作用。

<p:column headerText="Region Name"
    sortBy="#{province.region.description}">
    <h:outputText value="#{province.region.description}" />
</p:column>

尝试这样做会给我错误 org.hibernate.QueryException: could not resolve property: region.description of: my.package.entity.Province

我能想出的唯一解决方案是向Province 添加一个名为regionDescription 的瞬态字段,它返回相关区域的描述,但这是一个非常丑陋的hack。 有没有更好的方法来获得这个结果?

编辑:问题出在其他地方。这是来自 LazyDataModel 的相关代码

public List<Province> findLazyProvince(int startingAt, int maxPerPage,
        String sortField, SortOrder sortOrder, Map<String, String> filters)
{
    Criteria crit = buildCriteria(filters);

    if (sortField != null && !sortField.isEmpty()) {
        if (sortOrder.equals(SortOrder.ASCENDING)) {
            crit = crit.addOrder(Order.asc(sortField));
        } else {
            crit = crit.addOrder(Order.desc(sortField));
        }
    }
    crit = crit.setFirstResult(startingAt).setMaxResults(maxPerPage);
    return crit.list();
}

【问题讨论】:

  • 由于您使用的是 LazyDataModel,因此您的代码应该负责排序。
  • 啊,是的,你是对的。我的意思是,这就是我正在做的,但这也是问题所在;我会相应地更新问题,谢谢。

标签: hibernate jsf primefaces


【解决方案1】:

最后,我犯了一个愚蠢的错误:排序字段(在我的例子中是“region.description”)作为字符串原封不动地传递给 LazyDataModel,所以我有责任在代码中适当地处理它通过添加别名。

所以上面的代码应该是这样的

public List<Province> findLazyProvince(int startingAt, int maxPerPage,
    String sortField, SortOrder sortOrder, Map<String, String> filters)
{
    Criteria crit = buildCriteria(filters);

    if (sortField != null && sortField.equals("region.description")) {
        crit.createAlias("region", "region");
    }
    if (sortField != null && !sortField.isEmpty()) {
        if (sortOrder.equals(SortOrder.ASCENDING)) {
            crit = crit.addOrder(Order.asc(sortField));
        } else {
            crit = crit.addOrder(Order.desc(sortField));
        }
    }
    crit = crit.setFirstResult(startingAt).setMaxResults(maxPerPage);
    return crit.list();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多