проблема сортировки таблицы данных (JSF2.0 + простые лица) - PullRequest
1 голос
/ 30 марта 2011

Я не знаю, почему моя таблица данных не сортирует столбцы, когда я нажимаю на стрелку сортировки. Это работает, только если я сначала ввожу что-то в фильтр и удаляю его (как будто в фильтре должен быть хотя бы один символ для правильной сортировки).

Я вставлю код здесь:

Это страница JSF с таблицей данных

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:t="http://myfaces.apache.org/tomahawk"
xmlns:p="http://primefaces.prime.com.tr/ui">
    <ui:composition template="WEB-INF/templates/BasicTemplate.xhtml">
<ui:define name="resultsForm">
<h:form enctype="multipart/form-data">
    <h:inputText id="search" value="" /><h:commandButton value="search"/>

    <p:dataTable var="garbage" value="#{resultsController.allGarbage}" dynamic="true" paginator="true" paginatorPosition="bottom" rows="10"  
             paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"  
             rowsPerPageTemplate="5,10,15">         

            <p:column filterBy="#{garbage.filename}" filterMatchMode="startsWith" sortBy="#{garbage.filename}" parser="string">  
            <f:facet name="header">  
            <h:outputText value="Filename" />  
            </f:facet>  
            <h:outputText value="#{garbage.filename}" />
             </p:column> 

            <p:column filterBy="#{garbage.description}" filterMatchMode="contains">  
            <f:facet name="header">  
            <h:outputText value="Description" />  
            </f:facet>  
            <h:outputText value="#{garbage.description}" />  
             </p:column> 

            <p:column sortBy="#{garbage.uploadDate}" parser="string">  
            <f:facet name="header">  
            <h:outputText value="Upload date" />  
            </f:facet>  
            <h:outputText value="#{garbage.uploadDate}" /> 
             </p:column>                
    </p:dataTable> 
</h:form>
</ui:define>

Здесь управляемый компонент, взаимодействующий с этой страницей:

@ManagedBean
@ViewScoped implements Serializable
public class ResultsController {

@EJB
private ISearchEJB searchEJB;

private Garbage garbage;

public List<Garbage> getAllGarbage() {
    return searchEJB.findAllGarbage();
}

public Garbage getGarbage() {
    return garbage;
}

public void setGarbage(Garbage garbage) {
    this.garbage = garbage;
}   

EJB, который обращается к базе данных:

@Stateless(name = "ejbs/SearchEJB")
public class SearchEJB implements ISearchEJB {

@PersistenceContext
private EntityManager em;   
public List<Garbage> findAllGarbage() {
    Query query = em.createNamedQuery("findAllGarbage");
    List<Garbage> gList = new ArrayList<Garbage>();

    for (Object o : query.getResultList()) {
        Object[] cols = (Object[]) o;
        Garbage tmpG = new Garbage();
        tmpG.setFilename(cols[0].toString());
        tmpG.setDescription(cols[1].toString());
        tmpG.setUploadDate(cols[2].toString());

        gList.add(tmpG);
    }
    return gList;
}

}

Объект с именованным запросом JPQL:

    @NamedQuery(name = "findAllGarbage", query = "SELECT g.filename, g.description,    g.uploadDate FROM Garbage g;")
    @Entity
    public class Garbage implements Serializable{

@Id
@GeneratedValue
@Column(nullable = false)
private Long id;
@Column(nullable = false)
private String filename;
@Column(nullable = false)
private String fileType;
@Column(nullable = false)
private String uploadDate;
@Column(nullable = false)
private String destroyDate;
@Lob
@Column(nullable = false)
private byte[] file;
@Column(nullable = false)
private String description;

Экран печати с выводом из браузера

enter image description here

Ответы [ 3 ]

3 голосов
/ 04 апреля 2011

Мой опыт показывает, что базовый компонент-простейшие (ViewScoped!) Должен содержать собственный список строк. Так, например, если вы запрашиваете базу данных каждый раз, когда вы запрашиваете p: dataTable: значение, сортировка не будет работать. Решение: собрать список из базы данных и сохранить его в локальной переменной List в компоненте поддержки.

В указанном вами коде

public List<Garbage> getAllGarbage() {
    return searchEJB.findAllGarbage();
}

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

2 голосов
/ 31 июля 2011

Я хотел бы подтвердить, что у меня возникла точно такая же проблема, которая описана для primefaces-2.2.1.

Значение (элементы строки) моего dataTable вычисляется из запроса.

Сортировка по простому имени. Строковое свойство завершается ошибкой, если у меня также нет filterBy, и даже тогда оно работает, только если я наберу хотя бы одну букву в поле фильтра.Затем я могу отсортировать возрастание / убывание в отфильтрованном результате.

Webel

1 голос
/ 08 апреля 2013

Добавлено как ответ, а не комментарий к предыдущему ответу с тех пор.

Обновление: Primefaces 3.5, похоже, устранил эту проблему p: dataTable sortBy, о которой я сообщал в 2.2.1, и до сих порпроблема в 3.3.

Однако в Mac OS X p: dataTable корректно работает только на некоторых версиях Firefox на некоторых версиях Max OS X.

В Firefox 20.0 на Mac OS X все нормально10.6.8 (оба по-прежнему поддерживаются).

Существует ряд очень странных проблем в Firefox 16.0.2 (который является концом строки) в Mac OS X 10.5.8 (также конец строки), напримерпоскольку значки редактирования, появляющиеся как редактирование пером, галочками, крестами и строками, вообще не активируются, значок сортировки не появляется, а при сортировке заголовки столбцов взрываются и повторяются со странным смещением вправо от всех заголовков столбцов.Редактирование строк работало отлично с Primefaces 3.3 в Firefox 16.0.2 (который является концом строки) в Mac OS X 10.5.8.

В Mac OS X 10.5.8 редактирование строк и sortBy в Safari в порядке.5.0.6, а также Chrome 21.0.1180.90.

Эти тесты были выполнены на Glassfish 3.1.1 (в Netbeans7.1).Primefaces 3.3

http://code.google.com/p/primefaces/issues/detail?id=2476

http://forum.primefaces.org/viewtopic.php?f=3&t=14845

http://forum.primefaces.org/viewtopic.php?f=3&t=14838

...