Query接口的基本知识
使用Query对象可以方便的查询数据库中的数据,它主要使用HQL或者本地SQL查询数据。Query对象不仅能查询数据,还可以绑定参数、限制查询记录数量、实现批量删除和批量更新等。
Configuration cfg=new Configuration().configure("hibernate.cfg.xml");
SessionFactory sf=cfg.buildSessionFactory();
Session session=sf.getCurrentSession();
Transaction tx=session.beginTransaction();
Query query=session.createQuery("from UserInfoPO");
List list=query.list();
tx.commit();
上面代码表示Query对象通过Session对象的createQuery()方法创建,方法的参数值"from UserInfoPO"是HQL语言,表示要读取所有UserInfoPO类型的对象,即读取UserInfoPO表中所有的记录,把每一条记录封装成UserInfoPO对象后保存到List对象中并返回List对象。
Query对象在Session对象关闭之前有效,否则会抛出SessionException类型的异常。
Query接口的常用方法
Query接口的常用方法如下所示:
- setXxx()方法:用于设置HQL中问号或变量的值。
- list()方法:返回查询结果,并把查询结果转换成List对象。
- excuteUpdate()方法:执行更新或删除语句。
1、使用setXxx方法为HQL语句设置参数
常用的setXxx方法如下:
(1)、setBoolean():设置类型为boolean的参数。
(2)、setByte():设置类型为byte的参数。
(3)、setDate():设置类型为date的参数。
(4)、setDouble():设置类型为doublu的参数。
(5)、setInteger():设置类型为int的参数。
例:
Query query=session.createQuery("from UserInfoPO u where u.age>? and u.userName like ?");
query.setInteger(0,22); //设置第一个问号的值
query.setString(1,"%志%"); //设置第二个问号的值
2、使用list()方法获取查询结果
Query中的list()方法用于获取查询结果,并将查询结果转变成一个List接口的实例。
例如:
Query query=session.createQuery("from UserInfoPO u where u.age>? ");
query.setInteger(0,22);
List list=query.list();
for(int i=0;i<list.size();i++){
ui=(UserInfoPO)list.get(i);
Systom,out.println(ui.getUserName());
}
3、使用excuteUpdate()方法更新或删除数据
例:
Query query=session.createQuery("delete from UserInfoPO ");
q.excuteUpdate();
4、使用命名查询
可以不将HQL语句写在程序中,而是写入映射文件*.hbm.xml中,这样便于在需要的时候修改HQL。这是需要在映射文件中使用query标记,把HQL语句放入<![CDATA[]]>中。
例:
UserInfoPO.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 解析文件的DTD -->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 映射文件的根目录 -->
<hibernate-mapping>
<class name="PO.UserInfoPO" table="info" catalog="test">
<id name="id" type="int">
<column name="id"></column>
<generator class="increment"></generator>
</id>
<property name="userName" type="string">
<column name="userName" length="30" not-null="true"></column>
</property>
<property name="password" type="string">
<column name="password" length="30" not-null="true"></column>
</property>
</class>
<query name="queryUser_byAgeAndName">
<![CDATA[from UserInfoPO u where u.age>:minAge and u.userName like :userName]]>
</query>
</hibernate-mapping>
query标记的name属性用来设定查询外部HQL时的名称,使用命名查询的实例代码如下:
Query query=session.createQuery("queryUser_byAgeAndName");
query.setInteger("minAge",22);
query.setString("userName","%志%");
List list=query.list();
for(int i=0;i<list.size();i++){
ui=(UserInfoPO)list.get(i);
Systom,out.println(ui.getUserName());
}