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

Hibernate Java Discussion :

Requête avec inner join


Sujet :

Hibernate Java

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 121
    Par défaut Requête avec inner join
    Bonjour messieurs,
    Je suis actuellement a la recherche d’une requête hibernate sur mes DTO car j’ai une requête SQL qui s’exécute super bien quand je pace par un client SQL classique cette requête SQL est :
    Ma requête SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT v.VALUE FROM  t_value v 
    INNER JOIN (SELECT r.id_key, 
    MAX(r.id_goroco) AS id_goroco,
    MAX(r.id_value) AS id_value
    FROM t_rel_kvlg r INNER JOIN t_key k ON k.id_key = r.id_key
    WHERE r.id_goroco <=21 
    AND r.id_locale = 3
    AND (k.end_version = 0 OR k.end_version >=21 ) 
    AND k.start_version <= 21 
    AND k.id_project = 1 
    GROUP BY r.id_key, r.id_locale, k.start_version, k.end_version ) t ON v.id_value = t.id_value
    WHERE v.VALUE = 'to be translated' OR v.VALUE = 'Ã* traduire' OR v.VALUE = 'A traduire'
    Mon problème est quand je passe par hibernate je remplace dans la requête par mes DTO et ca ne marche pas pourtant j’ai regardé sur internet et pas de problème pour les inner join normalement je ne comprends pas vraiment à vrai dire. Si quelqu’un a des explications je suis preneur.
    Ma requête Hibernate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT VALUE AS VALUE 
    FROM  Value value inner join (SELECT kvlg.idKey, MAX(kvlg.idGoroco), MAX(kvlg.idValue) 
    FROM Kvlg kvlg inner join Key key ON key.idKey = kvlg.idKey 
    WHERE kvlg.idGoroco <= 21 
    AND kvlg.idLocale = 2 
    AND (key.endVersion = 0 OR key.endVersion >= 21 )
    AND key.startVersion <= 21 
    AND key.idProject = 1
    GROUP BY kvlg.idKey, kvlg.idLocale, key.startVersion, key.endVersion ) t ON value.idValue = t.idValue 
    WHERE value.VALUE = 'to be translated' OR value.VALUE = 'Ã* traduire' OR value.VALUE = 'A traduire'
    Sur le net pour les sous-reqête :
    - Note that HQL subqueries can occur only in the select or where clauses. source http://docs.jboss.org/hibernate/core.../queryhql.html

    J'ai l'impression que ma sous requête dans le inner join … il n’aime pas trop hibernate. Soit c’est sa soit je suis vraiment un manche … Si quelqu'un a une solution, je suis prenneur.

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Ce n'est pas du HQL ça, c'est du SQL...
    Tu l'exécutes via createQuery ?
    Si oui, utilises plutôt createSQLQuery (sql natif)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 121
    Par défaut
    Ma première requête je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List values = session.createSQLQuery("SELECT VALUE FROM  t_value v INNER JOIN (SELECT r.id_key, MAX(r.id_goroco) AS id_goroco, MAX(r.id_value) AS id_value FROM t_rel_kvlg r INNER JOIN t_key k ON k.id_key = r.id_key WHERE r.id_goroco <=21 AND r.id_locale = 3 AND (k.end_version = 0 OR k.end_version >=21 ) AND k.start_version <= 21 AND k.id_project = 1 GROUP BY r.id_key, r.id_locale, k.start_version, k.end_version ) t ON v.id_value = t.id_value WHERE v.VALUE = 'to be translated' OR v.VALUE = 'Ã* traduire' OR v.VALUE = 'A traduire' ").addEntity(Value.class).list();
    L'erreur qui se produit dans les logs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    org.hibernate.exception.SQLGrammarException: could not execute query
    Caused by: java.sql.SQLException: Column 'id_value' not found.
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)
    	at com.mysql.jdbc.ResultSet.findColumn(ResultSet.java:987)
    	at com.mysql.jdbc.ResultSet.getInt(ResultSet.java:2749)
    	at org.hibernate.type.IntegerType.get(IntegerType.java:28)
    	at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:163)
    	at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:154)
    	at org.hibernate.loader.Loader.getKeyFromResultSet(Loader.java:1097)
    	at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:565)
    	at org.hibernate.loader.Loader.doQuery(Loader.java:701)
    	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
    	at org.hibernate.loader.Loader.doList(Loader.java:2220)
    Et quand je passe par session.createQuery() avec ma 2ème requête message d'erreur aussi.

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Si id_value n'existe pas dans la table t_rel_kvlg c'est normal...
    J'ai l'impression que tu mixes les principes HQL et SQL mais comme je ne connais pas la structure physique des tes tables...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 121
    Par défaut
    id_value existe bien dans la table t_rel_kvlg

    Cette requête la avec mon client sql marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT VALUE FROM  t_value v 
    INNER JOIN (SELECT r.id_key, 
    MAX(r.id_goroco) AS id_goroco,
    MAX(r.id_value) AS id_value
    FROM t_rel_kvlg r INNER JOIN t_key k ON k.id_key = r.id_key
    WHERE r.id_goroco <=21 
    AND r.id_locale = 3
    AND (k.end_version = 0 OR k.end_version >=21 ) 
    AND k.start_version <= 21 
    AND k.id_project = 1 
    GROUP BY r.id_key, r.id_locale, k.start_version, k.end_version ) t ON v.id_value = t.id_value
    WHERE v.VALUE = 'to be translated' OR v.VALUE = 'Ã* traduire' OR v.VALUE = 'A traduire'
    Mais pas quand je passe avec hibernate via session.createSQLQuery() c'est pour ca qu'il doit y avoir un problème avec les paramétre que je passe après a savoir .addEntity(Value.class).list();

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    A quoi ressemble ta classe Value ?
    Peux-tu mettre la trace de l'erreur ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 121
    Par défaut
    Bonjour, messieurs désoler d'avoir mis pas mal de temp avant de répondre.

    Bon alors avec cette syntaxe là ca marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    List values = session.createSQLQuery("SELECT VALUE, v.id_value FROM  t_value v INNER JOIN (SELECT r.id_key, MAX(r.id_goroco) AS id_goroco, MAX(r.id_value) AS id_value FROM t_rel_kvlg r INNER JOIN t_key k ON k.id_key = r.id_key WHERE r.id_goroco <= "+gorocoId+" AND r.id_locale = "+idLocale+" AND (k.end_version = 0 OR k.end_version >= "+gorocoId+") AND k.start_version <= "+gorocoId+" AND k.id_project ="+projectId+ " GROUP BY r.id_key, r.id_locale, k.start_version, k.end_version ) t ON v.id_value = t.id_value WHERE v.VALUE = 'to be translated' OR v.VALUE = 'Ã  traduire' OR v.VALUE = 'A traduire' ")
    .addEntity(Value.class).list();
    Par contre j'aimerais une explication sur :
    -Pourquoi la première requête passe, et pas la deuxième ?
    Deuxième requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    List values = session.createSQLQuery("SELECT VALUE FROM  t_value v INNER JOIN (SELECT r.id_key, MAX(r.id_goroco) AS id_goroco, MAX(r.id_value) AS id_value FROM t_rel_kvlg r INNER JOIN t_key k ON k.id_key = r.id_key WHERE r.id_goroco <= "+gorocoId+" AND r.id_locale = "+idLocale+" AND (k.end_version = 0 OR k.end_version >= "+gorocoId+") AND k.start_version <= "+gorocoId+" AND k.id_project ="+projectId+ " GROUP BY r.id_key, r.id_locale, k.start_version, k.end_version ) t ON v.id_value = t.id_value WHERE v.VALUE = 'to be translated' OR v.VALUE = 'Ã  traduire' OR v.VALUE = 'A traduire' ")
    .addEntity(Value.class).list();
    Quand on attache une requête à une entité il faut que tout les champs de cette entité, dans le retour de la requête ?
    C'est la seul chose qui change donc je pense que ca ne peut être que ca.
    Si quelqu'un est certifier JSR220 ou pas mais qui connait bien hibernate et les entités.

    Merci encore pour vos réponses.

  8. #8
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Si je te demandais à quoi ressemble ta classe Value ce n'était pas pour rien...

    Ce sont les constructeurs de la classe qui sont déterminant.
    D'après ce que tu dis, il semble que tu ais un constructeur avec 2 arguments.
    La deuxième forme fait référence à un constructeur avec 1 argument.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 121
    Par défaut
    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
     
    @Entity
    @Table(name = "t_value")
    public class Value implements Serializable {
     
    	private static final long serialVersionUID = 1L;
     
    	/**
             * Index de la value en base
             */
    	private Integer idValue;
     
    	/**
             * Valeur de la clé
             */
    	private String value;
     
    	/**
             * Constructeur par défaut
             */
    	public Value() {
    		super();
    	}
     
    	/**
             * @param idValue
             * @param value
             */
    	public Value(Integer idValue, String value) {
    		super();
    		this.idValue = idValue;
    		this.value = value;
    	}
    Effectivement j'avais bien un constructeur avec 2 arguments.
    C'est pour ca que la requête ne passer pas.
    @OButterlin => merci.
    Et imaginons que j'aurais voulu cette requête avec un critéria ou un HQL comment j'aurais pu faire ? Dans ma requête remplacés mes tables par mes entités non ? Alors pourquoi ca ne marche pas ?

    Car quand je fais une requête HQL basic sur mes entités ca marche Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT value.value FROM Value as value WHERE value.idValue = 5
    Me renvoie bien la valeur pour l'idValue 5.
    Mais avec le inner join ca ne marche pas quelqu'un pourrais m'éclairer sur le principe du inner join avec HQL car j'ai lu la doc mais j'ai toujours un problème de compréhension.
    Et j'essai juste de transformer cette requête SQL qui marche en HQL ou critéria :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT VALUE, v.id_value 
    FROM  t_value v INNER JOIN (SELECT MAX(r.id_goroco) AS id_goroco,
    MAX(r.id_value) AS id_value
    FROM t_rel_kvlg r INNER JOIN t_key k ON k.id_key = r.id_key
    WHERE r.id_goroco <=21 
    AND r.id_locale = 2
    AND (k.end_version = 0 OR k.end_version >=21 ) 
    AND k.start_version <= 21 
    AND k.id_project = 1 
    GROUP BY r.id_key, r.id_locale, k.start_version, k.end_version ) t ON v.id_value = t.id_value
    WHERE v.VALUE = 'to be translated' OR v.VALUE = 'Ã* traduire' OR v.VALUE = 'A traduire'

Discussions similaires

  1. Requête update avec inner join
    Par mattmax dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 23/05/2013, 14h53
  2. Ma requête avec INNER JOIN
    Par vocal94130 dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/08/2010, 09h23
  3. [MySQL] Requête avec inner join
    Par kate59 dans le forum PHP & Base de données
    Réponses: 21
    Dernier message: 19/02/2008, 17h28
  4. [Access] Problème dans une requête SQL avec INNER JOIN ?
    Par bds2006 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/06/2006, 10h57
  5. requête avec inner join ?
    Par Melvine dans le forum Oracle
    Réponses: 5
    Dernier message: 30/03/2006, 09h16

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