示例代码:
- Session session = HibernateSessionFactory.getSession();
- session.beginTransaction();
- ① HQL语言的使用
- Query query = session.createQuery(" from User as user where user.id = ?");
- ②Query接口的set...方法
- query.setInteger(0, 1);
- ③Query接口的List方法
- List<User> list = query.list();
- ④遍历结果集
- Iterator<User> i = list.iterator();
- while(i.hasNext()){
- User user = i.next();
- System.out.println(user.getId()+" : "+user.getName());
- }
- session.getTransaction().commit();
- session.close();
1.HQL 语言与Query接口的使用
HQL:Hibernate Query Language
HQL是完全面向对象的查询语言,因此可以支持继承和多态等特征。
HQL查询依赖于Query类,每个Query实例对应一个查询对象,使用HQL查询按
如下步骤进行:
(1)获取Hibernate Session对象;
(2)编写HQL语句;
(3)以HQL语句作为参数,调用Session的createQuery方法创建查询对象;
(4)如果HQL语句包含参数,调用Query的setXxx方法为参数赋值;
(5)调用Query对象的list等方法遍历查询结果。
2.命名查询
把查询条件放置在程序之外,避免硬编码; 在*.hbm.xml中使用<query>标签, 在<![CDATE[ code]]> 中写HQL语句
- <hibernate-mapping>
- <class name="po.User" table="user" catalog="mytest">
- <id name="id" type="java.lang.Integer">
- <column name="id" />
- <generator class="uuid.hex" />
- </id>
- <property name="name" type="java.lang.String">
- <column name="name" length="256" />
- </property>
- <property name="age" type="java.lang.Integer">
- <column name="age" />
- </property>
- </class>
- <query name="idNameQuery">
- <![CDATA[
- from User as user where user.id = ?
- ]]>
- </query>
- </hibernate-mapping>
使用getNamedQuery()方法根据query的名字属性获取hql语句,以获取Query对象。
- Session session = HibernateSessionFactory.getSession();
- session.beginTransaction();
- List<User> list = session.getNamedQuery("idNameQuery").setInteger(0, 1).list();
-
- Iterator<User> i = list.iterator();
- while(i.hasNext()){
- User user = i.next();
- System.out.println(user.getId()+" : "+user.getName());
- }
- session.getTransaction().commit();
- session.close();
3. HQL的参数的绑定方式
Hibernate中对动态查询参数绑定提供了丰富的支持,在Hibernate中共存在4种参数绑定的方式,下面只介绍两种:
A、 按参数名称绑定:
在HQL语句中定义命名参数要用”:”开头,形式如下:
-
Query query=session.createQuery(“from User user where user.name
= :customername and user.age =
:customerage”);
-
query.
setString(“
customername”,name);
-
query.
setInteger(“
customerage”,age);
上面代码中用:customername和:customerage分别定义了命名参数customername和customerage,然后用Query接口的setXXX()方法设定名参数值,setXXX()方法包含两个参数,分别是命名参数名称和命名参数实际值。
B、 按参数位置邦定:
在HQL查询语句中用”?”来定义参数位置,形式如下:
-
Query query=session.createQuery(“from User user where user.name=
? and user.age =
? ”);
-
query.setString(
0,name);
-
query.setInteger(
1,age);
同样使用setXXX()方法设定绑定参数,只不过这时setXXX()方法的第一个参数代表邦定参数在HQL语句中出现的位置编号(由0开始编号),第二个参数仍然代表参数实际值。
注:在实际开发中,提倡使用
按名称邦定命名参数,因为这不但可以提供非常好的程序可读性,而且也提高了程序的易维护性,因为当查询参数的位置发生改变时,按名称邦定名参数的方式中是不需要调整程序代码的。
。