ITEEDU

Hibernate Gossip: 建立 SQL 查询

Hibernate提供了对SQL的支持,您可以指定您所要建立的SQL,并将实体类别与数据表格关联,举个例子来说,如果您打算使用像以下的SQL语句:
SELECT * FROM user WHERE age > 20
则您可以如下建立SQL查询:
// SQL,并指定别名为userString sql = "select {user.*} from User user where user.age > 20";
Session session = sessionFactory.openSession();
// 建立 SQLQuery
SQLQuery sqlQuery = session.createSQLQuery(sql);
// 将别名user与实体类User关联在一起
sqlQuery.addEntity("user", User.class);
Iterator iterator = sqlQuery.list().iterator();
while(iterator.hasNext()) {
    User user = (User) iterator.next();
    System.out.println(user.getAge() + "\t" + user.getName());
}
        
session.close(); 
addEntity()是将实体类别与别名连结在一起的方法,大括号指定要查询的数据,Hibernate根据所给定的SQL自动生成以下的句子:
select user.id as id0_, user.name as name0_0_, user.age as age0_0_ from User user where user.age > 20
返回的结果则由Hibernate进行封装为所指定别名关联之实体类,如此您可以得到使用SQL的弹性,但无需处理繁琐的ResultSet。

您也可以将SQL语句定义在映像文件中,例如:
User.hbm.xml
<?xml version="1.0" encoding="utf-8"?> </hibernate-mapping>
定义的时候,使用<return>卷标指定别名与实体类之关联,配合映像文件中的定义,您可以如下运行Hibernate:
Session session = sessionFactory.openSession();
Query query = session.getNamedQuery("onlyfun.caterpillar.QueryUser");
        
Iterator iterator = query.list().iterator();
while(iterator.hasNext()) {
    User user = (User) iterator.next();
    System.out.println(user.getAge() + "\t" + user.getName());
}
        
session.close();
也可以设定查询参数,例如:
....
<sql-query name="onlyfun.caterpillar.QueryUser">
<![CDATA[
select {user.*} from User user where user.age > :age
]]>
<return alias="user" class="onlyfun.caterpillar.User"/>
</sql-query>
....
使用Hibernate查询时如下:
Session session = sessionFactory.openSession();
Query query = session.getNamedQuery("onlyfun.caterpillar.QueryUser");
query.setInteger("age", 20);

Iterator iterator = query.list().iterator();
while(iterator.hasNext()) {
    User user = (User) iterator.next();
    System.out.println(user.getAge() + "\t" + user.getName());
}
        
session.close();