Hibernate学习之HQL详解1
来源:互联网 发布:excel数据验证限制 编辑:程序博客网 时间:2024/06/07 04:57
Hibernate具有三种查询方式:
HQL(Hibernate Query Language)检索
QBC(Query By Criteria)检索
Native SQL检索
以上三种查询方式都是通过Session对象 来操作的
HQL查询:
是完全面向对象的查询语句,查询功能非常强大,具备继承、多态和关联等特性 。
Hibernate使用Query接口来执行HQL语句,类似jdbc使用的PreparedStatement。
HQL语句不区分大小写,但是实体类及其属性例外
使用Query进行查询的步骤 :
创建Query对象
Query query = session.createQuery(“hql”);
绑定动态参数
执行查询/更新语句
使用占位符?指定参数:
例:“from User u where u.age > ?”
query.setInteger(0, 20);
参数的索引从0开始
使用命名参数指定参数:
例: “from User u where u.age > :age”
query.setInteger(“age”, 20);
正确设置时间类型
query.setTime 时分秒
query.setDate 日期
query.setTimestamp 日期+时分秒
list()
返回List对象,可以按索引随机访问对象
iterator()
返回Iterator对象,只能按从前到后的顺序依次访问对象
uniqueResult()
返回一个结果对象,一般确认结果集中只有一个符合条件的对象才使用此方法
技巧:可以使用setMaxResults()来限制个数
executeUpdate()
执行delete/update语句
如果实体类命名冲突,可使用完全类名形式
“from com.ourchr.hib.entity.User ”
查询所有用户信息
session.createQuery(“from User”).list();
查询年龄大于20的所有用户信息
session.createQuery(“from User u where u.age > 20”).list();
单个属性查询
session.createQuery(“select u.name from User u”).list();
返回的结果集中的对象是String类型
多属性查询
session.createQuery(“select u.name, u.password from User u”).list();
返回的结果集中是Object[]类型的数据,其长度等于属性列的个数
实体和属性混合查询
session.createQuery(“select u, u.name from User u”).list();
返回一个Object[]类型结果集,第一个元素是User对象,第二个元素是一个String对象
使用Query.executeUpdate()来执行操作:
让所有用户的年龄加1
session.createQuery(“update User set age = age + 1”).executeUpdate();
删除所有年龄小于10的用户
session.createQuery(“delete User where age < 10”).executeUpdate();
常规风格
Query query = session.createQuery(“from User u where u.age > ?”);
query.setInteger(0, 10);
List users = query.list();
方法链风格
List users = session.createQuery(“from User u where u.age > ?”).setInteger(0, 10).list();
分页查询:
设置最多查询多少条记录
query.setMaxResults(n)
设置从原始结果集中取最终结果的开始下标
query.setFirstResult(n)
Eg: 查询第10到19条记录
query.setFirstResult(10).setMaxResult(10)
级联查询:
session.createQuery("from Student s left join fetch s.clazz where s.name=:name")
注意不能使用left join Clazz c on …
以下配置对HQL查询不起作用:
<set name="students" fetch="join" >…
如果Student与Address之间存在一对的关联,则只要查询Student,系统会自动查询出对应的Address,不管是使用session.get还是query进行查询。
假定Clazz与Student存在一对多关联,则查询Clazz时并不会自动查询对应的Student。
使用query查询对应的班级信息时,set元素中的fetch配置将不起作用。默认情况下也不会级联查询学员信息。可以使用如下方案来实现级联查询。
方案一:
Clazz c = (Clazz)session.createQuery(“from Clazz c where …”).uniqueResult();
c.getStudents().size();
//以上第一行代码将查询到班级信息,第二行代码将查询到班级对应的学生信息,共执行两次查询。
方案二:
Clazz c = (Clazz)session.createQuery(“from Clazz c left join fetch c.students where …”).uniqueResult();
//以上查询班级时将自动通过左外连接查询对应的学生信息。共执行一次查询。
uniqueResult方法
如果我们检索一个对象,明确知道最多只有一个对象 ,则建议使用该方法:
具体用法如下:
Student s=(Student) session.createQuery("from Student where sid='20050003'").uniqueResult();
System.out.println(s.getSname());
distinct的用法
过滤重复的记录
//比如,显示所有学生的性别和年龄.
List list=session.createQuery("select distinct sage,ssex from Student").list();
for(int i=0;i<list.size();i++){
Object [] objs=(Object[]) list.get(i);
System.out.println(objs[0].toString()+" "+objs[1].toString());
}
between and..
List list=session.createQuery("select distinct sage,ssex,sname from Student where sage between 20 and 22").list();
for(int i=0;i<list.size();i++){
Object [] objs=(Object[]) list.get(i);
System.out.println(objs[0].toString()+" "+objs[1].toString()+objs[2].toString());
}
in /not in
//查询计算机系和外语系的学生信息
List<Student> list=session.createQuery("from Student where sdept in ('计算机系','外语系')").list();
//取出1. for 增强
for(Student s:list){
System.out.println(s.getSname()+" "+s.getSaddress()+" "+s.getSdept());
}
group by使用
//显示各个系的学生的平均年龄
List<Object[]> list=session.createQuery("select avg(sage),sdept from Student group by sdept").list();
//取出1. for 增强
for(Object[] obj:list){
System.out.println(obj[0].toString()+" "+obj[1].toString());
}
having的使用
//1.对分组查询后的结果,进行筛选:比如请显示人数大于3的系名称
//a. 查询各个系分别有多少学生.
List<Object[]> list=session.createQuery("select count(*) as c1,sdept from Student group by sdept having count(*)>3").list();
//取出1. for 增强
for(Object[] obj:list){
System.out.println(obj[0].toString()+" "+obj[1].toString());
}
查询计算机系共多少人?->如果我们返回的是一列数据
//这时我们的取法是直接取出list->object 而不是 list->Object[]
List<Object[]> list=session.
createQuery("select sage from Student where sdept='计算机系'").list();
//取出1. for 增强
for(Object obj:list){
System.out.println(obj.toString());
}
查询选修11号课程的最高分和最低分.
List<Object[]> list=session.createQuery("select 11,max(grade),min(grade) from Studcourse wherecourse .cid=11").list();
//取出1. for 增强
for(Object[] obj:list){
System.out.println(obj[0].toString()+" max="+obj[1].toString()+" min="+obj[2].toString());
}
显示各科考试不及格学生的名字(Student-student),科目(Course-course)和分数(Studcourse-studcourse)
List<Object[]> list=session.
createQuery("select student.sname,course.cname,grade from Studcourse where grade>=60").list();
//取出1. for 增强
for(Object[] obj:list){
System.out.println(obj[0].toString()+" "+obj[1].toString()+" "+obj[2].toString());
}
计算各个科目不及格的学生数量.
List<Object[]> list=session.createQuery("select count(*),student .sdept from Studcourse where grade<60 group bystudent .sdept").list();
//取出1. for 增强
for(Object[] obj:list){
System.out.println(obj[0].toString()+" "+obj[1].toString());
}
Query q=session.createQuery(hql);
q.setFirstResult (从第几条取//从0开始计算);
q.setMaxResult (取出几条);
请按照学生的年龄从小->大,取出第3到第5个学生
List<Student> list=session.createQuery("from Student order by sage").setFirstResult(2).setMaxResults(3).list();
for(Student s: list){
System.out.println(s.getSname()+" "+s.getSage());
}
- Hibernate学习之HQL详解1
- hibernate之HQL学习
- 【SSH】hibernate之hql学习
- Hibernate学习之HQL查询
- Hibernate学习---第十节:Hibernate之hql
- Hibernate学习笔记----HQL(1)
- hibernate学习之HQL那些事
- 【Hibernate学习之路6】HQL
- Hibernate学习之---使用HQL查询
- Hibernate HQL 语法详解
- hibernate hql 详解
- Hibernate HQL语言详解
- Hibernate HQL详解
- Hibernate:HQL详解
- hibernate HQL 语句详解
- Hibernate Hql详解
- Hibernate的HQL详解
- Hibernate HQL详解
- android注册页面
- sed 非常实用的几种用法!
- 为了忘却的纪念,我的天龙游戏生涯
- 彻底搞定C指针-函数名与函数指针
- 第二章:Samba服务全攻略
- Hibernate学习之HQL详解1
- 串口初始化中U0DLL=Fdiv%256怎样理解(待解决)
- luaL_optinteger (lua_State *L, int narg, lua_Integer def)
- interpret of gdb "gdb info reg"
- 埋藏
- Hibernate常用代码模板
- Hibernate学习小结之实体对象之间关系
- Java新浪微博客户端开发
- Hibernate和JDBC实现CRUD操作的比较