Ответ 1
Я смог заставить это работать.
По существу, нам нужно предоставить UIColumn в объекте SortMeta, чтобы он работал. Для начальной сортировки во время рендеринга мне пришлось найти компонент в моем bean и назначить его в sortMeta.
Ниже мой код в представлении xhtml
<p:dataTable id="transDataTable" var="trans"
value="#{myBean.transModel}" paginator="true" rows="50"
paginatorAlwaysVisible="false" lazy="true"
sortMode="multiple" sortBy="#{myBean.preSortOrder}"
resizableColumns="true">
<p:column headerText="User" sortBy="#{trans.user.name}" >
#{trans.user.name}
</p:column>
<p:column headerText="Company" sortBy="#{trans.companyName}">
#{trans.companyName}
</p:column>
<p:column headerText="Join Date" id="joinDateTime"
sortBy="#{trans.joinDateTime}" >
<h:outputText value="#{trans.joinDateTime}" />
</p:column>
</p:dataTable>
Вот мой код bean, вызываемый в @PostConstruct
/*
* method to build initial sort order for multisort
*/
private void buildSortOrder() {
UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();
UIComponent column = viewRoot.findComponent("transDataTable:joinDateTime");
SortMeta sm1 = new SortMeta();
sm1.setSortBy((UIColumn)column);
sm1.setSortField("joinDateTime");
sm1.setSortOrder(SortOrder.DESCENDING);
preSortOrder.add(sm1);
}
Я не уверен, что это правильный способ сделать это, но он работает. Мне обычно неудобно, когда мы должны использовать идентификаторы из представления в коде bean, так как это может привести к ошибкам, когда люди не будут осторожны.
Спасибо @CagatayCivici за быстрый подсказку.