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 :

Compter les éléments en JPA : fetched association was not present


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Par défaut Compter les éléments en JPA : fetched association was not present
    Salut à tous,

    J'ai une requête qui me permet de récupérer un ensemble d'éléments en base (JPA/Hibernate) :

    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
     
    public List<Content> findContentsOfChannelFetchTranslations(final String channelId, final LangEnum lang,final int first, final int pageSize) {
     
    	final String sql = "SELECT c FROM ChannelContentAssociation aso " +
    			" INNER JOIN aso.content c " +
    			" LEFT JOIN FETCH c.translations ct  " +
    			" WHERE aso.channelId = :channelId " +
    			" AND ct.lang = :lang " +
    			" ORDER BY c.pubDate DESC ";
     
    	final List<Content> contents = em.createQuery(sql, Content.class) /**/
                            .setParameter("channelId", channelId) /**/
    			.setParameter("lang", lang) /**/
                            .setFirstResult(first) /**/
    			.setMaxResults(pageSize) /**/
    			.getResultList();
     
    	return contents;
    }
    Comme vous pouvez le voir, dans cette requête, je limite le nombre de résultats.

    En parallèle, j'ai besoin de connaitre le nombre total d'éléments qui correspondent à mes critères (pour alimenter un paginator).

    Instinctivement j'ai juste ajouté COUNT(c) et sa variante COUNT(c.id) par désespoir :

    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
     
    public Integer findNumberOfContentsByChannel(final String channelId, final LangEnum lang) {
    	LOGGER.debug("findNumberOfContentsByChannel channelId {}", channelId);
     
    	final String sql = "SELECT COUNT(c.id) FROM ChannelContentAssociation aso " +
    			" INNER JOIN aso.content c " +
    			" LEFT JOIN FETCH c.translations ct  " +
    			" WHERE aso.channelId = :channelId " +
    			" AND ct.lang = :lang " ;
     
    	final Integer nb = em.createQuery(sql, Integer.class) /**/
                            .setParameter("channelId", channelId) /**/
    			.setParameter("lang", lang) /**/
    			.getSingleResult();
     
    	return nb;
    Mais je me mange une grosse exception :

    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
     
    18:11:09,599 DEBUG: com.masociete.extragroup.dao.ContentDao - findNumberOfContentsByChannel channelId 994a17cccd357110VgnVCM1000000100007f____
    22 oct. 2012 18:11:09 org.apache.catalina.core.ApplicationDispatcher invoke
    GRAVE: "Servlet.service()" pour la servlet Faces Servlet a lancé une exception
    org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list [FromElement{explicit,not a collection join,fetch join,fetch non-lazy properties,classAlias=ct,role=com.masociete.extragroup.model.content.Content.translations,tableName=CDC_CONTENT_TRANSLATIONS,tableAlias=translatio2_,origin=SIG_VIEW_CONTENT content1_,columns={content1_.KEYSTRING1 ,className=com.masociete.extragroup.model.content.ContentTranslation}}] [SELECT COUNT(c.id) FROM com.masociete.extragroup.model.content.ChannelContentAssociation aso  INNER JOIN aso.content c  LEFT JOIN FETCH c.translations ct   WHERE aso.channelId = :channelId  AND ct.lang = :lang ]
    	at org.hibernate.hql.internal.ast.tree.SelectClause.initializeExplicitSelectClause(SelectClause.java:204)
    	at org.hibernate.hql.internal.ast.HqlSqlWalker.useSelectClause(HqlSqlWalker.java:861)
    	at org.hibernate.hql.internal.ast.HqlSqlWalker.processQuery(HqlSqlWalker.java:651)
     
    ...
    	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    	at java.lang.Thread.run(Thread.java:662)
    22 oct. 2012 18:11:09 org.apache.catalina.core.StandardWrapperValve invoke
    GRAVE: Servlet.service() for servlet [default] in context with path [/C4ExtraGroupWeb] threw exception [Exception occurred while processing <channel2:#{prettyUrlManager.processChannel}> java.lang.IllegalArgumentException: org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list [FromElement{explicit,not a collection join,fetch join,fetch non-lazy properties,classAlias=ct,role=com.masociete.extragroup.model.content.Content.translations,tableName=CDC_CONTENT_TRANSLATIONS,tableAlias=translatio2_,origin=SIG_VIEW_CONTENT content1_,columns={content1_.KEYSTRING1 ,className=com.masociete.extragroup.model.content.ContentTranslation}}] [SELECT COUNT(c.id) FROM com.masociete.extragroup.model.content.ChannelContentAssociation aso  INNER JOIN aso.content c  LEFT JOIN FETCH c.translations ct   WHERE aso.channelId = :channelId  AND ct.lang = :lang ]] with root cause
    org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list [FromElement{explicit,not a collection join,fetch join,fetch non-lazy properties,classAlias=ct,role=com.masociete.extragroup.model.content.Content.translations,tableName=CDC_CONTENT_TRANSLATIONS,tableAlias=translatio2_,origin=SIG_VIEW_CONTENT content1_,columns={content1_.KEYSTRING1 ,className=com.masociete.extragroup.model.content.ContentTranslation}}] [SELECT COUNT(c.id) FROM com.masociete.extragroup.model.content.ChannelContentAssociation aso  INNER JOIN aso.content c  LEFT JOIN FETCH c.translations ct   WHERE aso.channelId = :channelId  AND ct.lang = :lang ]
    	at org.hibernate.hql.internal.ast.tree.SelectClause.initializeExplicitSelectClause(SelectClause.java:204)
    	at org.hibernate.hql.internal.ast.HqlSqlWalker.useSelectClause(HqlSqlWalker.java:861)
    	at org.hibernate.hql.internal.ast.HqlSqlWalker.processQuery(HqlSqlWalker.java:651)
    	at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:651)
    ...
    	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
    	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    	at java.lang.Thread.run(Thread.java:662)
    22 oct. 2012 18:11:32 org.apache.catalina.core.StandardServer await
    Heu, j'avoue que je suis une buse en JPA : j'ai donc besoin d'aide...

    Merci d'avance.
    Thierry Leriche-Dessirier
    Consultant Java JEE Web Agile freelance
    Rédacteur pour Developpez
    Professeur de Génie Logiciel à l'ESIEA

    Site : http://www.icauda.com / Linked'in : http://www.linkedin.com/in/thierryler / Twitter : @ThierryLeriche

  2. #2
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Par défaut
    En fait, il suffisait juste d'enlever le FETCH...
    Thierry Leriche-Dessirier
    Consultant Java JEE Web Agile freelance
    Rédacteur pour Developpez
    Professeur de Génie Logiciel à l'ESIEA

    Site : http://www.icauda.com / Linked'in : http://www.linkedin.com/in/thierryler / Twitter : @ThierryLeriche

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SQL] compter les éléments distincts dans une requête
    Par redwire dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 08/10/2006, 17h44
  2. Compter les éléments d'un hachage
    Par bollo dans le forum Langage
    Réponses: 7
    Dernier message: 31/03/2006, 16h20
  3. Réponses: 10
    Dernier message: 27/03/2006, 18h38
  4. compter les éléments d'un select
    Par jakouz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/12/2005, 13h40
  5. [TestStand] Compter les éléments d'une chaîne de caractères
    Par capblans dans le forum Autres langages
    Réponses: 2
    Dernier message: 29/04/2005, 09h29

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