Hibernate(五)__hql语句

hql(hibernate query language)功能强大。

首先回忆下之前我们接触的对数据对象的操作:

①删除session.delete(对象)

②保存session.save(对象)  session.persist(对象)

③修改obj.setXXX();

session.update(对象)

④查询session.load(***.class, 1) ; session.get(***.class, 1);

可是这样只能进行简单的数据操作,想要做较为复杂的操作,就要用到hql语句了。

hql的详解

hibernate 设计者 推荐我们在设计表的时候,应当每张表有一个主键,而且该主键最好不含业务逻辑(不要有实际意义)

如:product 表

id   productNo   name      price

1   bi001       冰箱       1000

2   nj111       电脑       2000

最好不要将产品编号设计成主键,产品编号假如变化那么整个数据表就会变化,伤筋动骨,但是如果设计另外一个主键id不含业务信息

变编号名字价格数据都是稳定的。

我们使用hibernate工具,自动生成 domain 对象和映射文件,如果我们的表有主外键的关系,则应当先映射主表,再映射从表。

我们建立三张表:学生、学生所选课程、课程。

表的关系和映射文件的关系如下(到后面我们专门学到一对多、多对一、多对多等对应关系):

*检索一个表中的所有数据对象

List<Student> list= session.createQuery("from Student ").list;

* 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();

//取出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();

//取出for 增强

for(Object[] obj:list){

System.out.println(obj[0].toString()+" "+obj[1].toString());

}

*having

1.对分组查询后的结果,进行筛选:比如请显示人数大于3的系名称

List<Object[]> list=session.createQuery("select count(*) as c1,sdept from  Student group by sdept having count(*)>3").list();

//取出for 增强

for(Object[] obj:list){

System.out.println(obj[0].toString()+" "+obj[1].toString());

}

//查询各个系的女生有多个个

List<Object[]> list=session.

createQuery("select count(*) as c1,sdept from Student where ssex=‘F‘ group by sdept").list();

//取出for 增强

for(Object[] obj:list){

System.out.println(obj[0].toString()+" "+obj[1].toString());

}

2.查询计算机系共多少人?->如果我们返回的是一列数据

//这时我们的取法是直接取出list->object 而不是 list->Object[]

List<Object[]> list=session.

createQuery("select sage from  Student where sdept=‘计算机系‘").list();

//取出for 增强

for(Object obj:list){

System.out.println(obj.toString());

}

3.查询选修11号课程的最高分和最低分.

List<Object[]> list=session.

createQuery("select 11,max(grade),min(grade) from Studcourse where course.cid=11").list();

//取出for 增强

for(Object[] obj:list){

System.out.println(obj[0].toString()+" max="+obj[1].toString()+" min="+obj[2].toString());

}

4.计算各个科目不及格的学生数量.

List<Object[]> list=session.

createQuery("select count(*),student.sdept from Studcourse where grade<60 group by student.sdept").list();

//取出1. for 增强

for(Object[] obj:list){

System.out.println(obj[0].toString()+" "+obj[1].toString());

}

参数绑定案例 (jdbc->PreparedStatement setXXX)

使用参数绑定的好处有3:

  1. 可读性提高, 2 效果高 3,防止 sql注入漏洞

面试题: 如果不使用参数绑定,怎样防止登录时, sql注入?

name  password

思路: 通过用户名,查询出该用户名在数据库中对应的密码,然后再与用户输入的秘密比较,如果相等,则用户和法,否则,非法.

参数绑定有两种形式

Query q=session.createQuery(from Student where sdept=:dept and sage>:age)

如果我们的参数是 :冒号形式给出的,则我们的参数绑定应当这样:

List<Student> list=session.createQuery("from Student where sdept=:a1 and sage>:sage")

.setString("a1", "计算机系").setString("sage", "2").list();

还有一种形式:

Query q=session.createQuery(from Student where sdept=? and sage>?)

如果我们的参数是以 ? 形式给出的则,参数绑定应当:

List<Student> list=session.createQuery("from Student where sdept=? and sage>?")

.setString(0, "计算机系").setString(1, "2").list();

参数的绑定,可以分开写:形式如下:

Query query=session.createQuery("from Student where sdept=? and sage>?");

query.setString(0, "计算机系");

query.setString(1, "2");

List <Student> list=query.list();

for(int i=0;i<list.size();i++){

Student s= list.get(i);

System.out.println(s.getSname()+" "+s.getSage());

}

时间: 2024-11-07 20:03:40

Hibernate(五)__hql语句的相关文章

Hibernate HQL查询语句总结

Hibernate HQL查询语句总结 1. 实体查询:有关实体查询技术,其实我们在先前已经有多次涉及,比如下面的例子:String hql="from User user ";List list=session.CreateQuery(hql).list();上面的代码执行结果是,查询出User实体对象所对应的所有数据,而且将数据封装成User实体对象,并且放入List中返回.这里需要注意的是,Hibernate的实体查询存在着对继承关系的判定,比如我们前面讨论映射实体继承关系中的E

Hibernate 的update语句性能详解

Hibernate 中如果直接使用 Session.update(Object o); 会把这个表中的所有字段更新一遍. 比如: view plaincopy to clipboardprint? public class TeacherTest { @Test public void update(){ Session session = HibernateUitl.getSessionFactory().getCurrentSession(); session.beginTransactio

采用p6spy完整显示hibernate的SQL语句

虽然在hibernate中有show_sql选项,但是显示出来的语句大多类似 select * from xxx where value=? 但是有时候我们需要得到完整的SQL语句,怎么办呢?使用P6SPY就可以完成这个任务 p6spy是一个开源软件,它可以跟踪任何使用jdbc的应用产生的数据库操作.特别适合于监控ejb服务器产生的 sql statements.官方网址:http://www.p6spy.com/目前p6spy 适用的应用服务器包括jboss, atg, orion, jona

在hibernate中用sql语句

在hibernate中用sql语句,语句是createSQLquery 查出来的是,一列或者多列的数据,要将其转化为对象,有两种方式, 对于已经被hibernate所管理的实体类,在后面加.addentity 然后用花括号在sql语句中,select之后from之前,每一个{表名.*},就可以查询出对象. 对于数据传输的dto类,用setresulttransformer.然后在select之后 from之前,把列名和dto的属性名一一as起来. 百万级的数据存储,用外键关联会降低效率 可以选择

hibernate(五) hibernate一对一关系映射详解

序言 之前讲解了一对多(单向.双向).多对多(双向),今天就讲解一下最后一个关系,一对一. 心情不错.状态也挺好的,赶紧写一篇博文造福一下大家把. --WZY 一.一对一关系的概述 一对一关系看起来简单,其实也挺复杂的.其中关系就包含了四种,单向双向和主键关联外键关联. 什么意思呢,也就是包含了单向一对一主键关联.双向一对一主键关联,单向一对一外键关联,双向一对一外键关联, 这四种中,单双向就不用在说了把,就是看你业务需求来去设置是否是单双向,而外键关联也很简单,前面的一对多和多对多度是依靠外键

hibernate 之 HQL语句总结【转】

1. 查询整个映射对象所有字段 //直接from查询出来的是一个映射对象,即:查询整个映射对象所有字段 String hql = "from Users"; Query query = session.createQuery(hql); List<Users> users = query.list(); for(Users user : users){ System.out.println(user.getName() + " : " + user.ge

打印hibernate的SQL语句的几种办法

摘要 使用hibernate时,我们常常需要查看hibernate实际提交到数据库的SQL及相关参数.这里提供几种方案,供大家在开发中使用. 使用hibernate-configuration 这也许是最简单的一种配置.我们只需要为hibernate配置一个参数,就可以在console中打印出SQL语句. 需要增加的仅仅是这个参数(其它参数略去): <hibernate-configuration>     <session-factory>         <propert

Hibernate(五)——面向对象查询语言和锁

Hibernate做了数据库中表和我们实体类的映射,使我们不必再编写sql语言了.但是有时候查询的特殊性,还是需要我们手动来写查询语句呢,Hibernate框架为了解决这个问题给我们提供了HQL(Hibernate  Query  Language)面向对象的查询语言,和QBC(Query by Criteria)完全面向对象的查询,这里简单总结一下如何是面向对象来编写ql语句呢.  一,HQL,Hibernate框架中的查询语言,是一种面向对象查询语言,和sql语句还是非常类似的,就是将sql

hibernate中hql语句中list和iterate区别

1.使用list()方法获取查询结果,每次发出一条语句,获取全部数据.2.使用iterate()方法获取查询结果,先发出一条SQL语句用来查询满足条件数据的id,然后依次按照这些id查询记录,也就是要执行N+1条SQL语句(N为符合条件的记录数) 两次执行list()方法,每次执行都是发出一条SQL语句,查询所有数据.下面看看两次执行iterate()方法的输出情况两次执行iterate()方法,第一次执行时发出了N+1条SQL语句,而第二次执行,则只发出一套SQL语句,与先执行list()方法