Hibernate学习之HQL详解1

manbucy 2012-09-03

Hibernate具有三种查询方式:

HQL(HibernateQueryLanguage)检索

QBC(QueryByCriteria)检索

NativeSQL检索

以上三种查询方式都是通过Session对象来操作的

HQL查询:

是完全面向对象的查询语句,查询功能非常强大,具备继承、多态和关联等特性。

Hibernate使用Query接口来执行HQL语句,类似jdbc使用的PreparedStatement。

HQL语句不区分大小写,但是实体类及其属性例外

使用Query进行查询的步骤:

创建Query对象

Queryquery=session.createQuery(“hql”);

绑定动态参数

执行查询/更新语句

使用占位符?指定参数:

例:“fromUseruwhereu.age>?”

query.setInteger(0,20);

参数的索引从0开始

使用命名参数指定参数:

例:“fromUseruwhereu.age>:age”

query.setInteger(“age”,20);

正确设置时间类型

query.setTime时分秒

query.setDate日期

query.setTimestamp日期+时分秒

list()

返回List对象,可以按索引随机访问对象

iterator()

返回Iterator对象,只能按从前到后的顺序依次访问对象

uniqueResult()

返回一个结果对象,一般确认结果集中只有一个符合条件的对象才使用此方法

技巧:可以使用setMaxResults()来限制个数

executeUpdate()

执行delete/update语句

如果实体类命名冲突,可使用完全类名形式

“fromcom.ourchr.hib.entity.User”

查询所有用户信息

session.createQuery(“fromUser”).list();

查询年龄大于20的所有用户信息

session.createQuery(“fromUseruwhereu.age>20”).list();

单个属性查询

session.createQuery(“selectu.namefromUseru”).list();

返回的结果集中的对象是String类型

多属性查询

session.createQuery(“selectu.name,u.passwordfromUseru”).list();

返回的结果集中是Object[]类型的数据,其长度等于属性列的个数

实体和属性混合查询

session.createQuery(“selectu,u.namefromUseru”).list();

返回一个Object[]类型结果集,第一个元素是User对象,第二个元素是一个String对象

使用Query.executeUpdate()来执行操作:

让所有用户的年龄加1

session.createQuery(“updateUsersetage=age+1”).executeUpdate();

删除所有年龄小于10的用户

session.createQuery(“deleteUserwhereage<10”).executeUpdate();

常规风格

Queryquery=session.createQuery(“fromUseruwhereu.age>?”);

query.setInteger(0,10);

Listusers=query.list();

方法链风格

Listusers=session.createQuery(“fromUseruwhereu.age>?”).setInteger(0,10).list();

分页查询:

设置最多查询多少条记录

query.setMaxResults(n)

设置从原始结果集中取最终结果的开始下标

query.setFirstResult(n)

Eg:查询第10到19条记录

query.setFirstResult(10).setMaxResult(10)

级联查询:

session.createQuery("fromStudentsleftjoinfetchs.clazzwheres.name=:name")

注意不能使用leftjoinClazzcon…

以下配置对HQL查询不起作用:

<setname="students"fetch="join">…

如果Student与Address之间存在一对的关联,则只要查询Student,系统会自动查询出对应的Address,不管是使用session.get还是query进行查询。

假定Clazz与Student存在一对多关联,则查询Clazz时并不会自动查询对应的Student。

使用query查询对应的班级信息时,set元素中的fetch配置将不起作用。默认情况下也不会级联查询学员信息。可以使用如下方案来实现级联查询。

方案一:

Clazzc=(Clazz)session.createQuery(“fromClazzcwhere…”).uniqueResult();

c.getStudents().size();

//以上第一行代码将查询到班级信息,第二行代码将查询到班级对应的学生信息,共执行两次查询。

方案二:

Clazzc=(Clazz)session.createQuery(“fromClazzcleftjoinfetchc.studentswhere…”).uniqueResult();

//以上查询班级时将自动通过左外连接查询对应的学生信息。共执行一次查询。

相关推荐