Hibernate Query Language(HQL)
Criteria Query
Native SQL
下面对其分别进行解释
Hibernate Query Language:
HQL提供了是十分强大的功能,它是针对持久化对象,用取得对象,而不进行update,delete和insert等操做。并且HQL是面向对象的,具有继承,多态和关联等特性。
from子句:
from子句是最简单的HQL,例如from Student,也能够写成 select s from Student s。它简单的返回Student类的全部实例。
值得注意的是除了JAVA类和属性的名称外,HQL语句对大小写不敏感。
select子句:
有时并不须要取得对象的全部属性,这时可使用select子句进行属性查询,如select s.name from Student s。
例:程序员
若是要查询两个以上的属性桧以数组的方式返回,以下:sql
在使用属性查询时,因为使用对象数组,操做和理解不太方便,若是将 一个object[]中全部成员封装成一个对象就方便多了。下面的程序作了示例:数据库
统计函数查询
能够在HQL中使用函数,常用的函数以下:
count():统计记录条数。
min():求最小值。
max():求最大值。
sum():求和。
avg():求平均值。
例如,要取得Student实例的数量,能够编写以下HQL语句:
select count(*) from Student
取得Student平均年龄的HQL语句:
select avg(s.age) from Student as s
可使用distinct去除重复的数据:
select distinct s.age from Student as s数组
where子句:
HQL也支持子查询,它经过where子句实现这一机制。where子句可让用户缩小要返回的实例的列表范围。例以下面语句会返回全部名字为"Bill"的Student实例:
Query query = session.createQuery("from Student as s where s.name='Bill'");
where子句容许出现的表达式包括了SQL中可使用的大多数状况。
数学操做:+,-,*,/
真假比较操做:=, >=, <=, <>, !=, like
逻辑操做:and ,or, not
字符串链接:||
SQL标题函数 :如upper()和lower()
若是查询返回多条记录,能够用如下关键字来量化
all:表示全部的记录。
any:表示全部记录中的任意一条。
some:与any相同。
in:与any等价。
exists:表示子查询至少要返回一条记录。
例如,下面语句返回全部学生年龄都大于18的班级对象
from Group g where 18<all (select s.age from g.students s)
下列语句返回在全部学生中有一个学生的年龄等于22的班级:
from Group g where 22 = any (select s.age from g.students s)
或者
from Group g where 22= some(select s.age from g.students s)
或者
from Group g where 22 in (select s.age from g.students s)session
order by子句
查询返回列表能够按照任何返回的类或者组件的属性排序
from Student s order by s.name ascapp
链接查询
与SQL同样,HQL也支持链接查询,如内链接,外链接和交叉链接:
inner join:内链接
left outer join:左外链接
rigth outer join:右外链接
full join:全链接,但不经常使用
下面我重点介绍下内链接查询,左外链接和或外链接和内链接大同小异,而全链接几乎没有使用获得的地方。
inner join能够简写为join,例如在查询获得的Group对象时,内链接取得对应的Student对象,实现的程序代码以下:less
Criteria Query方式
当查询数据时,每每须要设置查询条件。在SQL或HQL语句中,查询条件经常放在where子句中。此处Hibernate还支持Criteria查询,这种查询方式把查询条件封装为一个Criteria对象。在实际应用中,可使用Session的createCriteria()方法构建一个org.hibernate.Criteria实例,而后把具体的查询条件经过Criteria的add方法加入到Criteria实例中。这样程序员能够在不使用SQL甚至HQL的状况下进行数据查询。以下:函数
经常使用的查询限制方法
上面代码中 Restrictions.eq()方法表示equal,即等于的状况。Restrictions类提供了查询限制机制。它提供了许多方法,以实现查询限制
Restrictions.eq():equal,=
Restrictions.allEq(): 参数为Map对象,使用key/value进行多个等于的对比,至关于多个 Restrictions.eq()的效果
Restrictions.gt():greater-than,<
Restrictions.lt():less-than,<
Restrictions.le:less-equal,<=
Restrictions.between():对应SQL的between子句。
Restrictions.like():对应SQL的like子句。
Restrictions.in():对应SQL的in子句。
Restrictions.and():and 关系。
Restrictions.or():or 关系。
Restrictions.isNull():判断属性是否为空,为空返回true,不然返回false。
Restrictions.isNoyNull():与上面的相反。
Order.asc():根据传入的字段进行升序排序。
Order.desc():与上相反
MatchMode.EXACT:字符串中精确匹配,至关于like 'value'
MatchMode.ANYWHERE:字符串在中间位置,至关于like'%value%'
MatchMode.START:字符串在最前面,至关于like'value%'
MatchMode.END:字符串在最后,至关于like'%value'
下面是几个查询限制的例子:
查询学生名字以t开关的全部Student对象
Criteria criertia = session.createCriteria(Student.class);
criteria.add(Restrictions.like("name", "t%"));
List list = criteria.list();
Student stu = (Student)list.get(0);
或者:
Criteria criertia = session.createCriteria(Student.class);
criteria.add(Restrictions.like("name", "t",MatchMode.START));
List list = criteria.list();
Student stu = (Student)list.get(0);
查询学生姓名在Bill,Jack和Tom之间全部的Student对象
String[] names = {"Bill","Jack","Tom"};
Criteria criertia = session.createCriteria(Student.class);
criteria.add(Restrictions.in("name", names));
List list = criteria.list();
Student stu = (Student)list.get(0);
查询学生年龄(age)等于22或为空(null)的全部学生对象
Criteria criertia = session.createCriteria(Student.class);
criteria.add(Restrictions.eq("age", new Integer(22)));
criteria.add(Restrictions.isNull("age"));
List list = criteria.list();
Student stu = (Student)list.get(0);
查询学生姓名以字母F开头的全部Student对象,并按姓名升序排序
Criteria criertia = session.createCriteria(Student.class);
criteria.add(Restrictions.like("name", "F%"));
criteria.addOrder(Order.asc("name"));
List list = criteria.list();
Student stu = (Student)list.get(0);
注意调用Order.asc的方法应该是Criteria.addOrder()方法。fetch
链接限制
Criteria查询中使用FetchMode来实现链接限制。在HQL语句中,能够经过fetch关键字来表示预先抓取(Eager fetching),以下:
from Group g
left join fetch g.students s
where g.name like '%2005'
可使用Criteria的API完成一样的功能,以下:this
以上两种方式编写的代码都使用相同的SQL语句来完成它们的功能,以下:
select g.*, s.* from Group g
left outer join Student s
on g.id = s.group_id
where g.name like '%2005'
Native SQL查询
本地SQL查询指的是直接使用本地数据库的SQL语言进行查询。这样作对于将 原来的SQL/JDBC程序迁移到Hibernate应用颇有用
建立一个基于SQL的Query
Native SQL查询是经过SQLQuery接口来控制的,它经过调用Session.createSQLQuery()方法来得到。如:
命名SQL查询
与HQL的命名查询类似,也能够将 本地的SQK查询语句定义在映射文件中,而后像调用一个命名HQL查询同样专题报道调用命名SQL查询。
如:
配合以上配置咱们能够以下编写代码来查询
也能够在命名查询是设定参数,以下:
程序代码:
自定义insert , update和delete语句:
Hibernate 3.x的映射文件中新添加<sql_insert>,<sql_update>,<sql-delete>3个标记。可使用这3个标记自定义本身的insert ,update,delete语句,如:
对于以上自定义的SQL语句,要注意如下几点
1:insert 和update语句中定义的字段必须和映射文件声明的属性相应,一个都不能少。
2:在insert 和update语句中,属性出现的顺序必须和映射文件中的顺序同样。
3:在insert语句中,主键id老是放在最后。
在程序中实现以上自定义的insert语句以下:
若是不想在insert或update语句中包括全部属性,则能够在属性定义时 加上insert ="false"或update="false"以下: