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