Vous pouvez aussi écrire vos requêtes dans le dialecte SQL natif de votre base de données. Ceci est utile si vous souhaitez utiliser les fonctionnalités spécifiques de votre base de données comme le mot clé CONNECT d'Oracle. Cette fonctionnalité offre par ailleurs un moyen de migration plus propre et doux d'une application basée sur SQL/JDBC vers une application Hibernate.
Les requêtes de type SQL sont invocables via l'interface Query comme les requêtes HQL. La seule différence est l'utilisation de Session.createSQLQuery().
Query sqlQuery = sess.createSQLQuery("select {cat.*} from cats {cat}", "cat", Cat.class); sqlQuery.setMaxResults(50); List cats = sqlQuery.list();
Les trois arguments nécessaires à createSQLQuery() sont :
la chaîne de caractères représentant la requête SQL
un alias de table
la classe persistante retournée par la requête
L'alias est utilisé dans la requête pour référencer les propriétés de la classe mappée (Cat dans notre exemple). Vous pouvez récupérer plusieurs objets par ligne en passant en argument un tableau de string (d'alias) ainsi que le tableau de Class correspondantes.
La notation {cat.*} utilisée précédemment signifie "toutes les propriétés". Vous pouvez lister de manière explicite les propriétés, mais vous devez laisser Hibernate gérer les alias SQL des colonnes pour chaque propriété. La forme/nom de ces alias de colonnes est l'alias de leur table postfixé par le nom de la propriété (cat.id). Dans l'exemple suivant, nous récupérons Cats depuis une table (cat_log) différente de celle déclarée dans nos métadonnées de mapping. Notez que nous pouvons utiliser l'alias de la propriété dans la clause where.
String sql = "select cat.originalId as {cat.id}, " + " cat.mateid as {cat.mate}, cat.sex as {cat.sex}, " + " cat.weight*10 as {cat.weight}, cat.name as {cat.name}" + " from cat_log cat where {cat.mate} = :catId" List loggedCats = sess.createSQLQuery(sql, "cat", Cat.class) .setLong("catId", catId) .list();
A savoir : si vous listez chaque propriété de manière explicite, vous devez inclure toutes les propriétés de la classe et de ses sous-classes !
Des requêtes SQL nommées peuvent être définies dans le document de mapping et être appellées de la même manière que les requêtes HQL nommées.
List people = sess.getNamedQuery("mySqlQuery") .setMaxResults(50) .list();
<sql-query name="mySqlQuery"> <return alias="person" class="eg.Person"/> SELECT {person}.NAME AS {person.name}, {person}.AGE AS {person.age}, {person}.SEX AS {person.sex} FROM PERSON {person} WHERE {person}.NAME LIKE 'Hiber%' </sql-query>