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 :

Query : min and max ne sont pas pris en compte


Sujet :

JPA Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Query : min and max ne sont pas pris en compte
    Bonjour,

    Les champs correspondants à min et max dans un select ne sont pas renvoyés par Query.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Query query = em.createQuery("SELECT po.customerId.customerId, MAX(po.shippingCost), \n"+
    "MIN(po.shippingCost), COUNT(po.orderNum) countligne, COUNT(DISTINCT po.productId.productId) \n" +
    "FROM PurchaseOrder po WHERE po.customerId.customerId = :Id GROUP BY po.customerId.customerId");
    la trace sql dans le log eclipselink:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT t0.CUSTOMER_ID, COUNT(t1.ORDER_NUM), COUNT(DISTINCT(t2.PRODUCT_ID)) 
    FROM CUSTOMER t0, PRODUCT  t2, PURCHASE_ORDER t1 WHERE ((t1.CUSTOMER_ID = ?) 
    AND ((t0.CUSTOMER_ID = t1.CUSTOMER_ID) AND (t2.PRODUCT_ID = t1.PRODUCT_ID)))
    GROUP BY t0.CUSTOMER_ID
    Quelqu'un a une idée ?
    Merci d'avance.

    environnement: Netbeans 8.0.1, JDK 1.7, eclipseLink 2.5.2, JSF 2.2, Primefaces 5.0

  2. #2
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    Bonjour,

    Peut on savoir l'erreur retournée par hibernate?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    L'implémentation JPA que j'utilise est eclipseLink, pas hibernate.
    Il n'y a pas d'erreur, ni levée d'exception, du moins dans le log du serveur glassfish.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
      <persistence-unit name="org.desk_customers_war_1.0-SNAPSHOTPU" transaction-type="JTA">
        <jta-data-source>jdbc/sample</jta-data-source>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
            <property name="eclipselink.logging.level.sql" value="ALL"/>
            <property name="eclipselink.logging.parameters" value="true"/>
            <property name="eclipselink.logging.timestamp" value="true"/>
            <property name="eclipselink.logging.exceptions" value="true"/>
        </properties>
      </persistence-unit>
    </persistence>

  4. #4
    Membre chevronné Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Points : 2 120
    Points
    2 120
    Par défaut
    Salut,
    comment as-tu fait pour savoir qu´ils ne sont pas retournés?

    Eric

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    C'est après Query.getResultList().
    J'ai constaté que le tableau d'objet renvoyé ne contient que 2 valeurs au lieu de 4.
    En amont, la requête SQL n'a pas retenu min et max dans son select.

  6. #6
    Membre chevronné Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Points : 2 120
    Points
    2 120
    Par défaut
    salut,
    tu auras comme retour une liste d´objets:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    List<Object[]> resultat = querygetResultList();
    la tu as fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      Object[] objMinAndMaxResult = resultat .get(0);
    System.out.println('Min: ' + objMinAndMaxResult[1] + ' Max: ' + objMinAndMaxResult[2]);
    as -tu essayé cela?

    eric

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Re: min and max ne sont pas pris en compte
    J'ai rajouté ces lignes dans mon bean:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Query query = em.createQuery("SELECT po.customerId.customerId, MAX(po.shippingCost), MIN(po.shippingCost), COUNT(po.orderNum) countligne, COUNT(DISTINCT po.productId.productId) " +
                                            "FROM PurchaseOrder po WHERE po.customerId.customerId = :Id GROUP BY po.customerId.customerId");
            query.setParameter("Id", id);
            Object[] objMinAndMaxResult = ((List<Object[]>)query.getResultList()).get(0);
            System.out.println("objMinAndMaxResult.length = " + objMinAndMaxResult.length);
            for (int i = 0; i < objMinAndMaxResult.length; i++)
                System.out.println(String.format("objMinAndMaxResult[%d] = %s: ", i, objMinAndMaxResult[i]));

    Trace dans le log:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Précis:   SELECT t0.CUSTOMER_ID, COUNT(t1.ORDER_NUM), COUNT(DISTINCT(t2.PRODUCT_ID)) FROM CUSTOMER t0, PRODUCT t2, PURCHASE_ORDER t1 WHERE ((t1.CUSTOMER_ID = ?) AND ((t0.CUSTOMER_ID = t1.CUSTOMER_ID) AND (t2.PRODUCT_ID = t1.PRODUCT_ID))) GROUP BY t0.CUSTOMER_ID
    	bind => [777]
    Infos:   objMinAndMaxResult.length = 3
    Infos:   objMinAndMaxResult[0] = 777:
    Infos:   objMinAndMaxResult[1] = 1:
    Infos:   objMinAndMaxResult[2] = 1:
    Après quelques essais, il semble que ce soit l'alias de champ qui provoque la suppression des min et max:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            Query query = em.createQuery("SELECT po.customerId.customerId, MAX(po.shippingCost), MIN(po.shippingCost), COUNT(po.orderNum), COUNT(DISTINCT po.productId.productId) " +
                                            "FROM PurchaseOrder po WHERE po.customerId.customerId = :Id GROUP BY po.customerId.customerId");
    on obtient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Précis:   SELECT t0.CUSTOMER_ID, MAX(t1.SHIPPING_COST), MIN(t1.SHIPPING_COST), COUNT(t1.ORDER_NUM), COUNT(DISTINCT(t2.PRODUCT_ID)) FROM CUSTOMER t0, PRODUCT t2, PURCHASE_ORDER t1 WHERE ((t1.CUSTOMER_ID = ?) AND ((t0.CUSTOMER_ID = t1.CUSTOMER_ID) AND (t2.PRODUCT_ID = t1.PRODUCT_ID))) GROUP BY t0.CUSTOMER_ID
    	bind => [777]
    Infos:   objMinAndMaxResult.length = 5
    Infos:   objMinAndMaxResult[0] = 777:
    Infos:   objMinAndMaxResult[1] = 105.00:
    Infos:   objMinAndMaxResult[2] = 105.00:
    Infos:   objMinAndMaxResult[3] = 1:
    Infos:   objMinAndMaxResult[4] = 1:
    Le plus étonnant, c'est que les champs ont été retirés sans erreur ni avertissement !

    Merci pour vos réponses.

  8. #8
    Membre chevronné Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Points : 2 120
    Points
    2 120
    Par défaut
    Salut,
    mais les reponses que tu donnes sont le nombre d´elements que devait retourner la requette et c´est juste.
    Je ne vois pas ou est le probleme, rien n´est retiré.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Précis:   SELECT t0.CUSTOMER_ID, COUNT(t1.ORDER_NUM), COUNT(DISTINCT(t2.PRODUCT_ID)) FROM CUSTOMER t0, PRODUCT t2, PURCHASE_ORDER t1 WHERE ((t1.CUSTOMER_ID = ?) AND ((t0.CUSTOMER_ID = t1.CUSTOMER_ID) AND (t2.PRODUCT_ID = t1.PRODUCT_ID))) GROUP BY t0.CUSTOMER_ID
    	bind => [777]
    Infos:   objMinAndMaxResult.length = 3
    Infos:   objMinAndMaxResult[0] = 777:
    Infos:   objMinAndMaxResult[1] = 1:
    Infos:   objMinAndMaxResult[2] = 1:
    ta requetes select retourne 3 elements d´ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    objMinAndMaxResult.length = 3;
    Infos:   objMinAndMaxResult[0] = 777:  ==> t0.CUSTOMER_ID
    Infos:   objMinAndMaxResult[1] = 1:     ==> COUNT(t1.ORDER_NUM)
    Infos:   objMinAndMaxResult[2] = 1:     ==> COUNT(DISTINCT(t2.PRODUCT_ID))
    idem pour ta 2eme requete.

    Eric

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Le nombre d'éléments que renvoie la requête n'est pas juste:
    Dans cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Query query = em.createQuery("SELECT po.customerId.customerId, MAX(po.shippingCost), MIN(po.shippingCost), COUNT(po.orderNum) countligne, COUNT(DISTINCT po.productId.productId) " +
                                            "FROM PurchaseOrder po WHERE po.customerId.customerId = :Id GROUP BY po.customerId.customerId");
            query.setParameter("Id", id);
    je compte 5 champs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    1- po.customerId.customerId, 
    2- MAX(po.shippingCost), 
    3- MIN(po.shippingCost), 
    4- COUNT(po.orderNum) countligne, 
    5- COUNT(DISTINCT po.productId.productId)
    et le résultat n'en compte que 3, donc il en manque bien deux (5-3 = ... )

    désolé, c'est normal que tu vois pas où est le problème, vu que j'avais pas tout mis dans mon dernier post.

    Voici le même post en plus détaillé:
    1) requête SQL comprenant l'alias de champ "countLigne":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            Query query = em.createQuery("SELECT po.customerId.customerId, MAX(po.shippingCost), MIN(po.shippingCost), COUNT(po.orderNum) countligne, COUNT(DISTINCT po.productId.productId) " +
                                            "FROM PurchaseOrder po WHERE po.customerId.customerId = :Id GROUP BY po.customerId.customerId");
            query.setParameter("Id", id);
            Object[] objMinAndMaxResult = ((List<Object[]>)query.getResultList()).get(0);
            System.out.println("objMinAndMaxResult.length = " + objMinAndMaxResult.length);
            for (int i = 0; i < objMinAndMaxResult.length; i++)
                System.out.println(String.format("objMinAndMaxResult[%d] = %s: ", i, objMinAndMaxResult[i]));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Précis:   SELECT t0.CUSTOMER_ID, COUNT(t1.ORDER_NUM), COUNT(DISTINCT(t2.PRODUCT_ID)) FROM CUSTOMER t0, PRODUCT t2, PURCHASE_ORDER t1 WHERE ((t1.CUSTOMER_ID = ?) AND ((t0.CUSTOMER_ID = t1.CUSTOMER_ID) AND (t2.PRODUCT_ID = t1.PRODUCT_ID))) GROUP BY t0.CUSTOMER_ID
    	bind => [777]
    Infos:   objMinAndMaxResult.length = 3
    Infos:   objMinAndMaxResult[0] = 777:
    Infos:   objMinAndMaxResult[1] = 1:
    Infos:   objMinAndMaxResult[2] = 1:
    2) requête SQL sans l'alias de champ "countLigne":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            Query query = em.createQuery("SELECT po.customerId.customerId, MAX(po.shippingCost), MIN(po.shippingCost), COUNT(po.orderNum), COUNT(DISTINCT po.productId.productId) " +
                                            "FROM PurchaseOrder po WHERE po.customerId.customerId = :Id GROUP BY po.customerId.customerId");
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Précis:   SELECT t0.CUSTOMER_ID, MAX(t1.SHIPPING_COST), MIN(t1.SHIPPING_COST), COUNT(t1.ORDER_NUM), COUNT(DISTINCT(t2.PRODUCT_ID)) FROM CUSTOMER t0, PRODUCT t2, PURCHASE_ORDER t1 WHERE ((t1.CUSTOMER_ID = ?) AND ((t0.CUSTOMER_ID = t1.CUSTOMER_ID) AND (t2.PRODUCT_ID = t1.PRODUCT_ID))) GROUP BY t0.CUSTOMER_ID
    	bind => [777]
    Infos:   objMinAndMaxResult.length = 5
    Infos:   objMinAndMaxResult[0] = 777:
    Infos:   objMinAndMaxResult[1] = 105.00:
    Infos:   objMinAndMaxResult[2] = 105.00:
    Infos:   objMinAndMaxResult[3] = 1:
    Infos:   objMinAndMaxResult[4] = 1:
    Il semble bien que ce soit un "bug" du sql-parser de l'implémentation JPA eclipseLink, car il ne signale pas la perte des champs demandés.

Discussions similaires

  1. [texmaker] les modif dans ma biblio ne sont pas pris en compte
    Par membreComplexe12 dans le forum Bibliographies - Index - Glossaires
    Réponses: 4
    Dernier message: 09/09/2011, 10h54
  2. Réponses: 1
    Dernier message: 09/08/2010, 10h25
  3. les retours chariots ne sont pas pris en compte dans le textbox
    Par marco62118 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 01/08/2009, 21h30
  4. Float qui ne sont pas pris en compte sous ie6
    Par luna6 dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 11/03/2009, 14h11
  5. mes VirtualHost ne sont pas pris en compte
    Par ProgVal dans le forum Apache
    Réponses: 2
    Dernier message: 31/12/2008, 17h37

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