Primefaces 10+ Datatable как получить отсортированный столбец из SortEvent?

В настоящее время мы используем Primefaces версии 8, и я работаю над переходом на версию 12.

В руководстве по миграции 8.0 -> 10.0.0 в разделе DataTable критические изменения говорят следующее:

SortEvent: этому событию больше не передается отсортированное значение таблицы данных, вместо этого получите отсортированное значение через управляемый компонент (например, YourBean#list используется как выражение значения)

На всю жизнь я не могу понять, как передать столбец, сортируемый как выражение значения.

Вот что мы сейчас работаем с Primefaces 8 (упрощенно):

<p:dataTable id = "searchResultsTable" 
    value = "#{nameBackingBean.queryResults}"
    var = "searchResultsRow" widgetVar = "tableWidget"
    sortBy = "#{searchResultsRow.name}" sortOrder = "ascending">
    
    <p:ajax event = "sort" listener = "#{nameBackingBean.sortedColumnSelected}" />
    
    <!-- Name -->
    <p:column headerText = "Name"
        sortBy = "#{searchResultsRow.name}">
        <h:outputText id = "nameValue"
            value = "#{searchResultsRow.name}" />
    </p:column>
    
    <!-- Age -->
    <p:column headerText = "Age"
        sortBy = "#{searchResultsRow.age}">
        <h:outputText id = "ageValue"
            value = "#{searchResultsRow.age}" />
    </p:column>
    
    ...

А вот метод поддерживающего компонента Java, который вызывается при выполнении сортировки:

  public void sortedColumnSelected(AjaxBehaviorEvent event){
      if (null != event.getSource()){
         DataTable table = (DataTable) event.getSource();
         if (table != null && table.getSortColumn() != null){
            String headerText = table.getSortColumn().getHeaderText();
            String sortOrder = table.getSortOrder();
            
            if (headerText.equals("Name")){
               //we do something
            }else if (headerText.equals("Age")){
               //we do something else
            ...

Метод getSortColumn больше недоступен после Primefaces 8, поэтому я предполагаю, что мне нужно использовать какое-то выражение EL, чтобы выяснить, какой столбец был отсортирован (на основе предложения, например YourBean#list, используемого в качестве выражения значения) и передать значение в так...

<p:ajax event = "sort" listener = "#{nameBackingBean.sortedColumnSelected(el expression telling me what column was sorted)}" />

Если кто-нибудь знает, как отформатировать выражение значения, чтобы сказать мне, какой столбец был отсортирован, я был бы очень признателен!

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
335
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Конечно, после того, как я опубликовал это, я думаю, что понял это.

Похоже, в DataTable есть метод getActiveSortMeta, который содержит сортируемые столбцы. Ключом на карте является сортируемое поле. My DataTable позволяет сортировать только один столбец за раз, поэтому карта содержит только одну запись.

Вот мой пример кода:

public void sortedColumnSelected(AjaxBehaviorEvent event) {
  if (null != event.getSource()) {
     DataTable table = (DataTable) event.getSource();
     
     /* This map should contain the column that is being sorted. Since only
      * one column can be sorted at a time, there should only be one. */
     Map <String, SortMeta> sortMap = table.getActiveSortMeta();

     if (MapUtils.isNotEmpty(sortMap)) {
     
        String fieldName = sortMap.keySet().iterator().next();

        SortMeta meta = sortMap.get(fieldName);
        String sortOrder = meta.getOrder().name();

        /* set the sort order so the report can display correctly. */
        setSortAscending(sortOrder.equals("ASCENDING"));

        if (fieldName.equals("name")) {
          //do something
        } else if (fieldName.equals("age")) {
          //do something else
        }

Надеюсь, это поможет кому-то еще. Если вы знаете другой способ сделать это, я хотел бы услышать об этом.

Спасибо всем!

Другие вопросы по теме