Datatable не сортирует элементы в простых числах - PullRequest
2 голосов
/ 19 ноября 2011

Есть идеи, почему не работает сортировка?

<h:form prependId="false">

<p:dataTable value="#{questionBackingBean.questions}"
        var="question" id="questionTable" paginator="true" rows="15"
        paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
        rowsPerPageTemplate="15,25,50" paginatorPosition="bottom">


<p:column sortBy="#{question.id}">
    <f:facet name="header">ID</f:facet>
    <h:outputText value="#{question.id}" />
</p:column>
<p:column sortBy="#{question.description}">
    <f:facet name="header">Description</f:facet>
    <h:outputText value="#{question.description}" />
</p:column>
</h:form>

Вопрос сущности

@Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + id;
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (!(obj instanceof Question)) {
            return false;
        }
        Question other = (Question) obj;
        if (id != other.id) {
            return false;
        }
        return true;
    }

Бэк-бин

@ManagedBean
@ViewScoped
public class QuestionBackingBean implements Serializable {

    private static final long serialVersionUID = 1L;

    @Inject
    private QuestionLocal questionBean;
    private List<Question> questions;
    @Inject
    private Question question;
    private int questionParamId;

    public List<Question> getQuestions() {
        questions = questionBean.findAllQuestions();

        return questions;
    }

    public void setQuestions(List<Question> questions) {
        this.questions = questions;
    }

    public Question getQuestion() {
        return question;
    }

    public void setQuestion(Question question) {
        this.question = question;
    }

    public int getQuestionParamId() {
        return questionParamId;
    }

    public void setQuestionParamId(int questionParamId) {
        this.questionParamId = questionParamId;
    }

    public void init() {
        question = questionBean.findQuestion(questionParamId);
    }

    public String addQuestion() {
        questionBean.createQuestion(question);
        return "../index.xhtml";
    }
}

Ответы [ 2 ]

4 голосов
/ 19 ноября 2011

Вы возвращаете новый список каждый раз, когда вызывается getQuestions, выполнение этого в JSF является плохой практикой и замедляет работу вашего приложения, так как геттеры вызываются несколько раз в жизненном цикле запроса, особенно в итерации данных. Кэшируйте список вопросов в свойстве, получатель должен просто возвращать вопросы, а не загружать их.

Ваш список фактически сортируется в фазе применения значений запроса, но вы возвращаете новый экземпляр, когда геттер вызывается снова, а в последних фазах отсортированный список исчезает во время обработки.

1 голос
/ 09 мая 2013

Никогда не следует помещать бизнес-логику в геттер.

public List<Question> getQuestions() {
        questions = questionBean.findAllQuestions();

        return questions;
    }

изменить ее на

public List<Question> getQuestions() {
        return questions;
    }

и

public QuestionBackingBean(){
 this.questions = questionBean.findAllQuestions();
};

Поскольку вы используете конструктор @ViewScopeВам будет звонить каждый раз, когда вы обновляете, поэтому у вас есть последние данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...