Potete anche esprimere interrogazioni nel dialetto SQL nativo del vostro database. È una cosa particolarmente utile se volete utilizzare funzionalità specifiche del database come la parola chiave CONNECT in Oracle. Ciò consente anche di seguire un percorso di migrazione più pulito da una applicazione direttamente basata su SQL/JDBC ad una che si appoggi ad Hibernate.
Le interrogazioni SQL sono esposte tramite l'interfaccia Query, proprio come le normali interrogazioni HQL. La sola differenza è nell'uso del metodo Session.createSQLQuery().
Query sqlQuery = sess.createSQLQuery("select {cat.*} from cats {cat}", "cat", Cat.class); sqlQuery.setMaxResults(50); List cats = sqlQuery.list();
I tre parametri forniti al metodo createSQLQuery() sono:
la stringa con l'interrogazione SQL
il nome di un alias di tabella
la classe persistente restituita dall'interrogazione
Il nome dell'alias viene usato nella stringa sql per riferirsi alle proprietà della classe mappata (in questo caso Cat). Potete recuperare oggetti multipli per riga fornendo un array di String con i nomi degli alias e un array di Class per le classi corrispondenti.
La notazione {cat.*} usata sopra è un'abbreviazione per "tutte le proprietà". Potete anche elencare esplicitamente le proprietà, ma dovete lasciare che Hibernate fornisca alias di colonna per ogni proprietà. Le etichette per gli alias di queste colonne sono il nome della proprietà preceduto dall'alias di tabella. Nell'esempio seguente, recuperiamo oggetti Cat da una tabella diversa (cat_log) rispetto a quella dichiarata nei metadati di mappaggio. Notate che possiamo anche usare gli alias di proprietà nelle clausole "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();
Nota: se elencate esplicitamente ogni proprietà, dovete includere tutte le proprietà della classe e delle sue sottoclassi!
Le interrogazioni SQL con nome possono venire definite nel documento di mappaggio e chiamate esattamente nello stesso modo in cui viene chiamata una interrogazione HQL con nome.
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>