12.4.3. La déclaration INSERT

HQL ajoute la possibilité de définir les déclarations INSERT. Il n'existe pas d'équivalent JPQL. Le BNF d'une déclaration INSERT HQL est :
insert_statement ::= insert_clause select_statement

insert_clause ::= INSERT INTO entity_name (attribute_list)

attribute_list ::= state_field[, state_field ]*
La attribute_list est analogue à la column specification dans la déclaration INSERT de SQL. Pour les entités impliquées dans un héritage mappé, seuls les attributs définis directement sur l'entité nommée peuvent être utilisés dans la attribute_list. Les propriétés de sur-classe ne sont pas autorisées et les propriétés de sous-classe sont inutiles. En d'autres termes, les déclarations INSERT sont, par nature, non-polymorphes.

Avertissement

select_statement peut être n'importe quelle requête sélectionnée HQL valide, avec l'avertissement que les types de renvoi doivent correspondre aux types attendus par l'insertion. Actuellement, cela est vérifié lors de la compilation de requêtes plutôt que de permettre une vérification reléguée à la base de données. Cela pourrait causer des problèmes entre les types Hibernate qui sont equivalent et non pas equal. Par exemple, cela pourrait entraîner des problèmes avec des incompatibilités entre un attribut mappé en tant que org.hibernate.type.DateType et un attribut défini en tant que org.hibernate.type.TimestampType, bien que la base de données puisse ne pas faire la distinction ou puisse être capable de traiter la conversion.
Pour l'attribut de l'identifiant, la déclaration d'insertion vous propose deux options. Vous pouvez soit indiquer de manière spécifique la propriété de l'identifiant dans la attribute_list, dans quel cas sa valeur sera prise à partir de l'expression sélectionnée correspondante, ou l'omettre à partir de la attribute_list, dans quel cas une valeur générée sera utilisée. Cette dernière option n'est disponible que lors de l'utilisation de générateurs d'identifiants qui opèrent « dans la base de données ». Tenter d'utiliser cette option avec n'importe quel générateur de type « en mémoire » causera une exception en cours de traitement.
Pour les attributs de verrouillages optimistes, la déclaration d'insertion vous propose à nouveau deux options : vous pouvez soit indiquer l'attribut dans la attribute_list, dans quel cas sa valeur sera prise à partir des expressions sélectionnées correspondantes, ou l'omettre à partir de la attribute_list dans quel cas la seed value définie par le org.hibernate.type.VersionType correspondant sera utilisé.

Exemple 12.3. Exemple d'énoncé de requêtes INSERT

String hqlInsert = "insert into DelinquentAccount (id, name) select c.id, c.name from Customer c where ...";
int createdEntities = s.createQuery( hqlInsert ).executeUpdate();