IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JPA Java Discussion :

JPA manager par Spring - Pagination


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 56
    Par défaut JPA manager par Spring - Pagination
    Bonjour,

    J'aurai besoin d'un conseil sur la meilleur façon de procéder pour paginer une requête. Après plusieurs recherches j'ai trouver plusieurs solutions, mais quelle est la mieux selon mon cas ?

    Je souhaite implémenter l'interface Iterator de façon à ce qu'il me retourne des copies (avec certaines actions effectuées sur des attributs de ces copies) de mes entity trouvés. Etant donné que ma requête risque de retourner un nombre conséquent de données il faut que je fasse une requête paginée.

    Pour information j'utilise l'entityManager avec spring...

    Quelqu'un aurait une idée donc sur la meilleure façon de faire ? enfin j'ai surtout besoin de savoir ce que ma requête doit retournée comme objet, un scroll() ? un iterator sur un getResultList() ?

    Car pour mon iterator j'implémente simplement la méthode next() avec juste la méthode de process sur un entity...

    Merci d'avance...

  2. #2
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 56
    Par défaut
    Donc voilà comment j'ai réaliser ma "pagination", mon seul problème est que je n'arrive pas a vérifier si j'ai bien une pagination qui s'effectue car j'ai une erreur de cast au bout d'un traitement d'un nombre conséquent de données, je ne comprend pas ce pb de cast car d'autres objets A ont une même relation avec le même objet B et le cast fonctionne bien. J'ai bien vérifié l'objet et je ne trouve pas de problème, donc je soupçonne CGLIB ou justement le scroll... Sinon voici mes différents codes :

    mon dao qui retourne le scrollableResults :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public ScrollableResults findAllPagine() {
    return ((Session) this.getEntityManager().getDelegate()).createQuery(
                        "select e from " + getEntityBeanType().getName() + " e" 
                        + " left join fetch e.structRattachement"
                        + " left join fetch e.groupes"
                        + " left join fetch e.fonctions"
                        + " Order by e.structRattachement.id ASC")
                        .scroll(ScrollMode.FORWARD_ONLY);
    Et mon iterator qui effectue le transferts des données dans un Value Object avec certains traitements spécifiques, la méthode fonction qui effectue le traitement fonctionne correctement en passant les objet un à un (lors d'une requête sur les id en boucle) ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    public class PaginIterator<T> implements Iterator<T> {
     
        /** L'iterateur de la requête sql. */
        private ScrollableResults result;
     
        /** Type de l'entity. */
        private Class<T> entityBeanType;
     
        /**
         * Constructeur de l'objet PaginIterator.java.
         */
        public PaginIterator() {
            super();
        }
     
        /**
         * Constructeur de l'objet PaginIterator.java.
         * @param result Liste des objets obtenu par une requête.
         * @param classe Type de l'entity.
         */
        public PaginIterator(final ScrollableResults result, final Class<T> classe) {
            this.entityBeanType = classe;
            this.result = result;
        }
     
        /**
         * @return boolean vrai si le curseur sur objet n'est pas sur le dernier objet de la liste, sinon faux. 
         * @see java.util.Iterator#hasNext()
         */
        public boolean hasNext() {
            if (result != null && !result.isLast()) {
                return true;
            }
            return false;
        }
     
        /**
         * @return T l'entity current.
         * @see java.util.Iterator#next()
         */
        @SuppressWarnings("unchecked")
        public T next() {
            if (result.next()) {
                if (entityBeanType.getName().equals(
                        org.esco.sarapis.commons.vo.personne.APersonne.class.getName())) {
                    return (T) EntityToVO.apersonneToVO((APersonne) result.get(0));
                } else if (entityBeanType.getName().equals(
                        org.esco.sarapis.commons.vo.structure.AStructure.class.getName())) {
                    return (T) EntityToVO.astructureToVO((AStructure) result.get(0));
                }
            }
            return null;
        }
     
        /**
         * 
         * @see java.util.Iterator#remove()
         */
        public void remove() {
            // TODO Auto-generated method stub
     
        }
    }

    Et voici l'erreur que j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    09/08 11:04:08 - DEBUG  [main] SessionImpl                   - initializing proxy: [org.esco.sarapis.db.entity.structure.AStructure#4]
    09/08 11:04:08 - DEBUG  [main] DefaultLoadEventListener      - attempting to resolve: [org.esco.sarapis.db.entity.structure.AStructure#4]
    09/08 11:04:08 - DEBUG  [main] DefaultLoadEventListener      - resolved object in session cache: [org.esco.sarapis.db.entity.structure.AStructure#4]
    09/08 11:04:08 - DEBUG  [main] TransactionAspectSupport      - Completing transaction for [org.esco.sarapis.db.mock.ITestVO.testAPersVO] after exception: java.lang.ClassCastException: org.esco.sarapis.db.entity.structure.AStructure$$EnhancerByCGLIB$$94174208
    09/08 11:04:08 - DEBUG  [main] RuleBasedTransactionAttribute     - Applying rules to determine whether transaction should rollback on java.lang.ClassCastException: org.esco.sarapis.db.entity.structure.AStructure$$EnhancerByCGLIB$$94174208
    J'ai l'erreur qui arrive toujours au même moment de traitement (en effectuant une requête sur un sous ensemble l'erreur arrivera toujours sur le même objet mais un objet différent du sur ensemble).

    Ensuite je n'obtient pas d'erreur si je ne traite qu'un petit nombre d'objet, donc cela ne viendrait pas d'un problème de ressource ? Le Scroll gère mal la "pagination" par rapport aux ressources allouées ? ou après traitement faut il que je libère les objets traités ? Comment réaliser cela ?

Discussions similaires

  1. [Data] JPA managé par Spring 2.5 - transaction
    Par nean_j dans le forum Spring
    Réponses: 9
    Dernier message: 25/02/2011, 13h58
  2. JPA manager par Spring - configuration
    Par nean_j dans le forum JPA
    Réponses: 1
    Dernier message: 17/09/2008, 16h05
  3. Réponses: 7
    Dernier message: 07/08/2008, 11h39
  4. [Data] [Spring DAO][JPA] JPA managé par Spring 2.5
    Par Ylias dans le forum Spring
    Réponses: 2
    Dernier message: 09/06/2008, 19h48
  5. Initialisation JPA par Spring
    Par Alwin dans le forum JPA
    Réponses: 3
    Dernier message: 05/12/2007, 14h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo