Native SQL Queries
本地SQL检索
本地SQL查询是直接使用数据库SQL语言进行查询。
在JDBC的SQL查询中,必须面对繁琐的ResultSet操作,而Hibernate的SQL查询接口对查询结果进行了妥善的封装,返回的结果是映射过的实体对象,从ResultSet中取出数据并组装成对象的过程由Hibernate透明地完成。
//1.基本的SQL查询,查询所有属性
public void testQueryUser() {
Configuration cfg = null;
SessionFactory sf = null;
Session session = null;
Transaction ts = null;
try {
sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂
session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例
ts = session.beginTransaction();//创建事务
NativeQuery nq = session.createNativeQuery("select * from T_USER u where u.age > 40",User.class);
List users = nq.getResultList();
Iterator iterator = users.iterator();
while(iterator.hasNext()) {
User u=(User)iterator.next();
System.out.println(u.toString());
}
ts.commit();//提交事务
} catch (Exception e) {
e.printStackTrace();
if(ts != null) {
ts.rollback();
}
}finally {
}
}
User.hbm.xml
<sql-query name="QueryUsers">
<![CDATA[
select * from T_USER u
]]>
<return alias="u" class="cn.hrbust.pojo.User"/>
</sql-query>
//2.基本的SQL查询,通过标签进行查询
public void testQueryUserByTag() {
Configuration cfg = null;
SessionFactory sf = null;
Session session = null;
Transaction ts = null;
try {
sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂
session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例
ts = session.beginTransaction();//创建事务
Query sqlQuery = session.getNamedQuery("QueryUsers");
List users = sqlQuery.getResultList();
Iterator iterator = users.iterator();
while(iterator.hasNext()) {
User u=(User)iterator.next();
System.out.println(u.toString());
}
ts.commit();//提交事务
} catch (Exception e) {
e.printStackTrace();
if(ts != null) {
ts.rollback();
}
}finally {
}
}
自定义insert、update、delete
Hibernate 3的映射文件中新增了、与三个卷标,您可以在这三个卷标中使用SQL自定义你的INSERT、UPDATE、DELETE,也就是储存、更新、删除资料时的行为
<class name="User" table="table_User" dynamic-update="true">
<id name="id" column="userid">
<generator class=“assigned”/> <!—如果是native的话,就不用插入userid>
</id>
<property name="name" column="username"/>
<property name="password"/>
<property name="age"/>
<property name="birthday"/>
<sql-insert>
INSERT INTO table_user (username,password,age,birthday,userid) VALUES (?,?,?,?,?)
</sql-insert>
<sql-update>
UPDATE table_user SET username=?,password=?,age=?,birthday=? WHERE userid=?
</sql-update>
<sql-delete>
DELETE FROM table_user WHERE userid=?
</sql-delete>
</class>
//保存瞬时用户对象
public void testSaveUser() {
Configuration cfg = null;
SessionFactory sf = null;
Session session = null;
Transaction ts = null;
//创建user
User u = new User();
u.setName("李四");
u.setGender("女");
u.setAge(18);
u.setBirthday(Date.valueOf("2001-1-1"));
//u:瞬时对象,没有对象id,没有纳入session管理,他的任何变化不会自动地发送SQL语句
u.setName("赵六");
try {
// //创建Configuration对象
// cfg = new Configuration().configure();
// //创建Session工厂
// sf = cfg.buildSessionFactory();
//使用单例模式创建Configuration对象和Session工厂
sf = HibernateUtil.getSessionFactory();
//创建Session
//session = sf.openSession();
//保证每个读写线程有唯一的session实例
session = sf.getCurrentSession();
//创建事务
ts = session.beginTransaction();
//持久化操作:session保存对象
session.save(u);
//u:持久对象,有对象id,纳入session管理,他的任何变化会自动地发送SQL语句
//姓名并没有发生改变,只执行一次insert
u.setName("王五");//属性改变,持久化对象的属性变化会发送update语句
//提交事务
ts.commit();
u.setName("zhaowu");//事务提交后,session关闭,属性改变,此时的对象的属性变化不会发送update语句
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
if(ts != null) {
ts.rollback();
}
}finally {
//关闭session
//session.close();
//sf.close();
}
}
总结
HQL功能最强大,适合各种情况,但是动态条件查询构造起来很不方便。
QBC最适合动态条件查询,不太适合统计查询,QBE还不够强大,只适合相当简单的查询。
NativeSQL课时实现特定数据库的SQL,但是可移植性不好。