Я знаю, что этот вопрос довольно старый, но я просто работал над этим, поэтому я решил поделиться своим решением на будущее.
Мы используем PrimeFaces 3.5
Это было реализовано только в отложенной загрузочной таблице и никогда не реализовывалось в таблице в памяти. Самое большое различие, которое может существовать, заключается в том, что вам необходимо сохранить тип столбца (Class) для таблицы в памяти.
Прежде всего, вам нужен какой-то контроллер SessionScoped, в который вы можете сохранить состояние сортировки. Вам необходимо сохранить два состояния: столбец сортировки и порядок сортировки (по возрастанию / убыванию).
Во-вторых, свяжите p: datatable с объектом в вашем контроллере ViewScoped (binding="#{viewController.datatable}"
) и реализуйте для него базовый метод получения и установки. В методе сеттера у меня есть это:
public void setDatatable(DataTable datatable) {
ExpressionFactory expressionFactory = ExpressionFactory.newInstance();
ELContext elContext = FacesContext.getCurrentInstance().getELContext();
if(!datatableInitialized) {
if(getSessionController().getSortState() == null) {
datatable.setValueExpression("sortBy", expressionFactory.createValueExpression(elContext, DEFAULT_SORT_COLUMN, Object.class));
datatable.setSortOrder(DEFAULT_SORT_DIRECTION);
} else {
SortState state = getSessionController().getSortState();
datatable.setValueExpression("sortBy", expressionFactory.createValueExpression(elContext, state.getValueExpression(), Object.class));
datatable.setSortOrder(state.getDirection());
}
datatableInitialized = true;
}
this.datatable = datatable;
}
Важными битами являются строки setValueExpression, для второго параметра метода createValueExpression требуется выражение стиля JSF, а именно: #{pojo.stuff}
. Также обратите внимание на то, что я просто использую Object.class в качестве типа, я думаю, что мне это сойдет с рук, потому что таблица загружается лениво, и я сама выполняю всю сортировку в реализации LazyDataModel.
В-третьих, добавьте событие сортировки в таблицу данных:
<p:ajax event="sort" listener="#{viewController.sortListener}" />
и слушатель в контроллере:
public void sortListener(SortEvent event) {
SortState state = new SortState();
state.setValueExpression(event.getSortColumn().getValueExpression("sortBy").getExpressionString());
state.setDirection(event.isAscending() ? "ascending" : "descending");
getSessionController().setOpportunitiesSortState(state);
}
Вот и все.