Hibernate, JPA : DTYPE et requêtes JPQL (Java Persistence Query Language)

By , 22/12/2011

Avec JPA, il est possible de modéliser son modèle de données avec une notion d’héritage. Par exemple, ci-dessous, il existe deux entités Pomme et Poire qui héritent de l’entité Fruit :

Exemple d'une hérarchie d'entités JPA

La stratégie par défaut du lien d’héritage consiste à stocker dans une même table l’ensemble des données des objets et d’utiliser une colonne discriminante permettant de définir pour chaque ligne le type de la donnée (un Fruit, une Pomme ou une Poire).

Avec Hibernate, cette colonne s’appelle DTYPE. Par défaut, il n’y a aucune référence à cette colonne dans le code Java. Dans ces conditions, il existe plusieurs solutions pour utiliser cette colonne dans les requêtes JPQL :

  • Implicite : utiliser le type Fruit ou l’un des sous-types Pomme ou Poire pour filtrer sur le type du fruit :
from Fruit where ...

from Pomme where...

from Poire where ...
  • Explicite : ajouter une nouvelle variable d’instance neutre pour mapper la colonne DTYPE de la classe mère :
@Column(insertable = false, updatable = false)
private String dtype;
...
// Exemple d'un requête JPQL utilisant dtype pour ordonner les entités par type :
"from Fruit where ... order by dtype";

Leave a Reply


eight − 7 =

OfficeFolders theme by Themocracy