Named SQL queries can be defined in the mapping document and called in exactly the same way as a named HQL query. In this case, no need to call addEntity().
SELECT person.NAME AS {person.name}, person.AGE AS {person.age},
person.SEX AS {person.sex} FROM PERSON person WHERE person.NAME LIKE :namePattern
List people = sess.getNamedQuery("persons").setString("namePattern", namePattern)
.setMaxResults(50)
.list();
The element is use to join associations and the element is used to define queries which initialize collections,
SELECT person.NAME AS {person.name},person.AGE AS {person.age},person.SEX AS {person.sex}, address.STREET AS {address.street}, address.CITY AS {address.city}, address.STATE AS {address.state}, address.ZIP AS {address.zip} FROM PERSON person
JOIN ADDRESS address ON person.ID = address.PERSON_ID AND address.TYPE='MAILING'
WHERE person.NAME LIKE :namePattern
A named SQL query may return a scalar value. You must declare the column alias and Hibernate type using the element:
SELECT p.NAME AS name, p.AGE AS age, FROM PERSON p WHERE p.NAME LIKE 'Hiber%'
Now we can externalize the resultset mapping information in a element which will allow you to either reuse them across several named queries or through the setResultSetMapping() API.
SELECT person.NAME AS {person.name},
person.AGE AS {person.age},
person.SEX AS {person.sex},
address.STREET AS {address.street},
address.CITY AS {address.city},
address.STATE AS {address.state},
address.ZIP AS {address.zip}
FROM PERSON person
JOIN ADDRESS address
ON person.ID = address.PERSON_ID AND address.TYPE='MAILING'
WHERE person.NAME LIKE :namePattern
You can, alternatively, use the resultset mapping information in your hbm files directly in java code.
List students = sess.createSQLQuery
(
"select {student.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = student.id"
)
.setResultSetMapping("studentAndKitten")
.list();