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 :

case dans un group by


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 43
    Par défaut
    Bonjour,

    Je suis en train de tester JPA pour exécuter une requête sur une base Oracle (10g) et je suis confronté à un problème.

    Voici la requête que je veux exécuter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT
        COUNT(id),
        CASE texte
            WHEN 'test' THEN 'test'
            ELSE texte
        END
    FROM TEST_ORACLE
    GROUP BY
        CASE texte
            WHEN 'test' THEN 'test'
            ELSE texte
        END
    Sur SQL Developper, cette requête est bien exécutée mais avec JPA, j'ai une erreur
    979 (not a GROUP BY expression ).
    Voici le code qui tente de faire la requête.
    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
     CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
     
            CriteriaQuery<Tuple> c = cb.createTupleQuery();
     
            Root<testEntity> from = c.from(testEntity.class);
     
            Expression caseExpression = cb.selectCase(from.get("texte"))
                .when("test","test")
                .otherwise(from.get("texte"));
     
            c.multiselect(cb.count(from).alias("COUNT"), caseExpression)
                .groupBy(caseExpression);
     
            TypedQuery<Tuple> tq = getEntityManager().createQuery(c);
     
            return tq.getResultList();
    Ainsi que mon entité :
    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
    @Entity
    @Table(name="TEST_ORACLE")
    public class testEntity implements Serializable {
        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long id;
     
        private String texte;
     
        public String getTexte() {
            return texte;
        }
     
        public void setTexte(String texte) {
            this.texte = texte;
        }
     
        public Long getId() {
            return id;
        }
     
        public void setId(Long id) {
            this.id = id;
        }    
    }
    Je précise que lorsque je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c.multiselect(cb.count(from).alias("COUNT")).groupBy(caseExpression);
    La requête est bien exécutée.

    Quelqu'un saurait-il m'expliquer d'où vient le problème ?

    Merci d'avance pour votre aide.

  2. #2
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 43
    Par défaut
    J'ai reussi à faire marcher ma requête.

    voici le nouveau code :

    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
     CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
     
            CriteriaQuery<Tuple> c = cb.createTupleQuery();
     
            Root<testEntity> from = c.from(testEntity.class);
     
            Expression caseExpression = cb.selectCase(from.get("texte"))
                .when("test","test")
                .otherwise(from.get("texte"));
     
            c.multiselect(cb.count(from).alias("COUNT"), caseExpression)
                .groupBy(caseExpression);
     
            TypedQuery<Tuple> tq = getEntityManager().createQuery(c);
     
            tq.setHint(QueryHints.BIND_PARAMETERS, HintValues.FALSE);
     
            return tq.getResultList();
    il fallait ajouter la ligne tq.setHint(QueryHints.BIND_PARAMETERS, HintValues.FALSE); pour ne plus faire de ma requête une requête préparée. Et là, ca marche.

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

Discussions similaires

  1. [AC-2007] Case à cocher dans un groupe d'option
    Par Petit Rasta dans le forum IHM
    Réponses: 2
    Dernier message: 20/04/2010, 11h19
  2. Réponses: 0
    Dernier message: 20/11/2009, 18h00
  3. Réponses: 3
    Dernier message: 08/03/2008, 17h18
  4. GROUP_ID dans requete GROUP BY
    Par quemener dans le forum Oracle
    Réponses: 11
    Dernier message: 25/10/2004, 10h59
  5. Réponses: 6
    Dernier message: 26/01/2003, 13h45

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