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 :

Nom de colonne non valide dans requête SQL native suite à l'ajout d'un héritage


Sujet :

JPA Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 62
    Points : 55
    Points
    55
    Par défaut Nom de colonne non valide dans requête SQL native suite à l'ajout d'un héritage
    Ce message est plus une solution qu'un problème qui est peut-être simple mais qui m'a pris un peu de temps hier.

    j'ai une table A et une table B dont la clé primaire est une clé étrangère de la table A. Au niveau des classes j'ai une classe A, une classe B qui dérive de la classe A
    Au niveau des déclarations dans les entités j'ai
    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
    @Entity
    @Inheritance(strategy=InheritanceType.JOINED)
    public class A{
     
      @Id
       int id_A
    ...
    }
     
    @PrimaryKeyJoinColumn(name = "id_B")
    puiblic class B extends A{
     
    // Pas d'id
    ...
    }
    Tout ça fonctionne très bien.

    Je rajoute un héritage entre B et une classe C donc j'applique le même schéma que ci-dessus entre B et C et là j'ai des native queries auxquelles je n'ai pas touché qui ne marchent plus (javax.persistence.EntityManager.createNativeQuery) du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    createNativeQuery("SELECT * FROM A, B WHERE A.id_A = B.i_dB", B.class)
    Erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SQL Error: 17006, SQLState: null
    Nom de colonne non valide / invalid column name
    En plus l'exception a la gentillesse de ne rien me dire de plus en détail.

    En fait la raison est simple, pour le mapping des données de A.class, B.class ou C.class, il s'attend à avoir toutes les données. Donc suite à l'ajotu de l'héritage vers C, il faut absolument avoir les colonnes de C, qu'elles soient nulels ou non. Donc pour les native queries, il faut rajouter des jointures (égalité / INNER ou OUTER si les id ne sont pas dans chaque table)

    Vous me direz, les native queries, c'est naze comparé aux query ou named queries qui en plus gèrent le mapping des entités. Je suis bien d'accord mais certaines requêtes sont parfois très longues à réécrire.

    En espérant que ça serve

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 62
    Points : 55
    Points
    55
    Par défaut Petit complément
    En fait ça ne marche pas complètement.

    Si vous faites une requête du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Query query = mgr.createNativeQuery("SELECT A.*, B.*, C.*  FROM A, B, C", C.class)
    ça marche

    Par contre, si vous essayez de mapper sur B.class ou A.class vous aurez l'erreur décrite dans mon message précédent.

    La raison est que, pour les cas où on mappe sur une des classes qui n'est pas en bout d'héritage, JPA a besoin de savoir laquelle via une propriété clazz_ dans la requête. Pour en connaitre les valeurs, créez une requête non native et récupérez le SQL générée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Query query = mgr.createQuery("SELECT a, b, c  FROM A a, B b, C c", A.class)
    Dans mon cas j'ai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    case 
     when C.idC is not null then 2 
     when B.idB is not null then 1
     when A.idA is not null then 0
    end as clazz_
    Donc au final, pour mapper sur la classe C il faudra

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Query query = mgr.createNativeQuery("SELECT A.*, B.*, C.*, 2 as class_  FROM A, B, C", C.class)
    Plus d'infos :
    http://www.methodicmadness.com/2009/...eck-clazz.html

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

Discussions similaires

  1. [2008] Nom de colonne non valide dans un IF
    Par ikeabp dans le forum Développement
    Réponses: 3
    Dernier message: 22/08/2014, 12h31
  2. [Web Services] java.sql.SQLException: Nom de colonne non valide, WHY?
    Par mehdikwa dans le forum Spring
    Réponses: 13
    Dernier message: 27/02/2014, 17h07
  3. Réponses: 3
    Dernier message: 21/07/2013, 11h06
  4. Réponses: 5
    Dernier message: 02/12/2010, 17h04
  5. [SQL] Résultat de fonction php non valide dans requête SQL
    Par darksnake dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/12/2007, 14h44

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