日期:2014-05-16  浏览次数:20471 次

HQL查询语句基础

????? 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开始编号),第二个参数仍然代表参数实际值。
?   注:在实际开发中,提倡使用按名称邦定命名参数,因为这不但可以提供非常好的程序可读性,而且也提高了程序的易维护性,因为当查询参数的位置发生改变时,按名称邦定名参数的方式中是不需要调整程序代码的。