我正在使用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();
}
由于您使用LazyDataModel,你的代码应该采取排序的照顾。 – perissf
啊,是的,你说得对。我的意思是,这就是我正在做的,但这也是问题所在。我会相应地更新这个问题,谢谢。 –