Précédent   Forum des professionnels en informatique > Java > Général Java > Persistance > JPA
JPA Forum d'entraide sur l'API de persistance JPA (Java Persistence API)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/01/2012, 10h08   #1
Nouveau Membre du Club
 
Homme Lionel
Développeur Web
Inscription : mai 2006
Messages : 42
Détails du profil
Informations personnelles :
Nom : Homme Lionel
Âge : 35
Localisation : France

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

Informations forums :
Inscription : mai 2006
Messages : 42
Points : 25
Points : 25
Envoyer un message via MSN à varex
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 :
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
Citation:
979 (not a GROUP BY expression ).
Voici le code qui tente de faire la requête.
Code :
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 :
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 :
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.
varex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 10h54   #2
Nouveau Membre du Club
 
Homme Lionel
Développeur Web
Inscription : mai 2006
Messages : 42
Détails du profil
Informations personnelles :
Nom : Homme Lionel
Âge : 35
Localisation : France

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

Informations forums :
Inscription : mai 2006
Messages : 42
Points : 25
Points : 25
Envoyer un message via MSN à varex
J'ai reussi à faire marcher ma requête.

voici le nouveau code :

Code :
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.
varex est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h44.


 
 
 
 
Partenaires

Hébergement Web