2013-07-05 151 views
0

我正在使用PrimeFaces,Spring和Hibernate开发JSF 2.1项目。PrimeFaces,根据属性属性对p进行排序

我已经通过JoinColumn相关的实体,称为地区的实体称为省份:

@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:无法解析属性:的region.description:my.package.entity.Province

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

编辑:问题在别处。这里是从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(); 
} 
+0

由于您使用LazyDataModel,你的代码应该采取排序的照顾。 – perissf

+0

啊,是的,你说得对。我的意思是,这就是我正在做的,但这也是问题所在。我会相应地更新这个问题,谢谢。 –

回答

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(); 
} 
相关问题