30.1. Legacy Named SQL queries
<div class="paragraph">
Named SQL queries can also be defined during mapping and called in exactly the same way as a named HQL query.
In this case, you do _not_ need to call `addEntity()` anymore.
</div>
<div class="exampleblock">
<div class="title">Example 503. Named sql query using the `<sql-query>` mapping element</div>
<div class="content">
<div class="listingblock">
<div class="content">
<pre class="prettyprint highlight">`<sql-query name = "persons">
<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 :namePattern
</sql-query>`</pre>
</div>
</div>
</div>
</div>
<div class="exampleblock">
<div class="title">Example 504. Execution of a named query</div>
<div class="content">
<div class="listingblock">
<div class="content">
<pre class="prettyprint highlight">`List people = session
.getNamedQuery( "persons" )
.setParameter( "namePattern", namePattern )
.setMaxResults( 50 )
.list();`</pre>
</div>
</div>
</div>
</div>
<div class="paragraph">
The `<return-join>` element is use to join associations and the `<load-collection>` element is used to define queries which initialize collections.
</div>
<div class="exampleblock">
<div class="title">Example 505. Named sql query with association</div>
<div class="content">
<div class="listingblock">
<div class="content">
<pre class="prettyprint highlight">`<sql-query name = "personsWith">
<return alias="person" class="eg.Person"/>
<return-join alias="address" property="person.mailingAddress"/>
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
</sql-query>`</pre>
</div>
</div>
</div>
</div>
<div class="paragraph">
A named SQL query may return a scalar value.
You must declare the column alias and Hibernate type using the `<return-scalar>` element:
</div>
<div class="exampleblock">
<div class="title">Example 506. Named query returning a scalar</div>
<div class="content">
<div class="listingblock">
<div class="content">
<pre class="prettyprint highlight">`<sql-query name = "mySqlQuery">
<return-scalar column = "name" type="string"/>
<return-scalar column = "age" type="long"/>
SELECT p.NAME AS name,
p.AGE AS age,
FROM PERSON p WHERE p.NAME LIKE 'Hiber%'
</sql-query>`</pre>
</div>
</div>
</div>
</div>
<div class="paragraph">
You can externalize the resultset mapping information in a `<resultset>` element which will allow you to either reuse them across several named queries or through the `setResultSetMapping()` API.
</div>
<div class="exampleblock">
<div class="title">Example 507. <resultset> mapping used to externalize mappinginformation</div>
<div class="content">
<div class="listingblock">
<div class="content">
<pre class="prettyprint highlight">`<resultset name = "personAddress">
<return alias="person" class="eg.Person"/>
<return-join alias="address" property="person.mailingAddress"/>
</resultset>
<sql-query name = "personsWith" resultset-ref="personAddress">
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
</sql-query>`</pre>
</div>
</div>
</div>
</div>
<div class="paragraph">
You can, alternatively, use the resultset mapping information in your hbm files directly in java code.
</div>
<div class="exampleblock">
<div class="title">Example 508. Programmatically specifying the result mapping information</div>
<div class="content">
<div class="listingblock">
<div class="content">
<pre class="prettyprint highlight">`List cats = session
.createSQLQuery( "select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id" )
.setResultSetMapping("catAndKitten")
.list();`</pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect2">