2 votes

Datatable ne trie pas les éléments dans PrimeFaces

Savez-vous pourquoi le tri ne fonctionne pas?

    ID

    Description

Entité Question

@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;
    }

Bean de support

@ManagedBean
@ViewScoped
public class QuestionBackingBean implements Serializable {

    private static final long serialVersionUID = 1L;

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

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

        return questions;
    }

    public void setQuestions(List 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";
    }
}

4voto

Cagatay Civici Points 3335

Vous retournez une nouvelle liste à chaque fois que getQuestions est appelé, faire cela en JSF est une mauvaise pratique et ralentit votre application car les getters sont appelés plusieurs fois dans le cycle de vie de la requête, en particulier dans l'itération des données. Mettez en cache votre liste de questions dans une propriété, le getter ne devrait que retourner les questions sans les charger.

Votre liste est en fait triée dans la phase de valeurs de requête appliquées, mais vous retournez une nouvelle instance lorsque le getter est appelé à nouveau dans les phases postérieures, la liste triée est donc perdue pendant le traitement.

1voto

Makky Points 3289

Vous ne devriez jamais mettre de la logique métier dans un getter

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

        return questions;
    }

change it to

public List getQuestions() {
        return questions;
    }

and

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

Comme vous utilisez @ViewScope, le constructeur sera appelé à chaque rafraîchissement pour avoir les données les plus récentes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X