hql(hibernate query language)功能强大。

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

①删除session.delete(对象)

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

③修改obj.setXXX();

④查询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());

}

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

  1. ssh架构之hibernate(五)hql语句狂练

    1.练习题 1.查询所有商品的名称[查询特定属性](只有一个参数的话可以使用List<String>接收数据)2.查询所有商品的名称和供应商[查询特定属性](多个参数可以使用List< ...

  2. Hibernate常用查询语句

    Hibernate常用查询语句 Hib的检索方式1'导航对象图检索方式.通过已经加载的对象,调用.iterator()方法可以得到order对象如果是首次执行此方法,Hib会从数据库加载关联的orde ...

  3. Javascript权威指南——第二章词法结构,第三章类型、值和变量,第四章表达式和运算符,第五章语句

    第二章 词法结构 一.HTML并不区分大小写(尽管XHTML区分大小写),而javascript区分大小写:在HTML中,这些标签和属性名可以使用大写也可以使用小写,而在javascript中必须小写 ...

  4. 在hibernate中用sql语句

    在hibernate中用sql语句,语句是createSQLquery 查出来的是,一列或者多列的数据,要将其转化为对象,有两种方式, 对于已经被hibernate所管理的实体类,在后面加.adden ...

  5. Hibernate执行sql语句

    Hibernate执行sql语句:BasicServiceImpl basicServiceImpl = new BasicServiceImpl();String hql = "selec ...

  6. Hibernate HQL查询语句总结

    Hibernate HQL查询语句总结 1. 实体查询:有关实体查询技术,其实我们在先前已经有多次涉及,比如下面的例子:String hql="from User user ";L ...

  7. hibernate HQL添加语句

    1.Hibernate HQL添加语句 save();方法使用HQL语句来完成插入操作是不能实现的,不管你使用insert into....values...还是insert into.....sel ...

  8. Hibernate的hql语句save,update方法不执行

    Hibernate的hql语句save,update方法不执行 可能出现的原因问题: 未进行事务管理 需要进行xml事务配置或者注解方式的事务配置

  9. Hibernate 的update语句性能详解

    Hibernate 中如果直接使用 Session.update(Object o); 会把这个表中的所有字段更新一遍. 比如: view plaincopy to clipboardprint? p ...

随机推荐

  1. javascript_basic_01之概述

    1.javascript组成: ①核心ECMAScript:②文档对象模型DOM(Document Object Model):③浏览器对象模型BOM(Browser Object Model): 2 ...

  2. Unity3D Editor模式下批量修改prefab

    最经遇到一个需要批量修改已经做好的prefab的问题,查了一些资料最终实现了但是还是不够完美,通过学习也发现unity的编辑器功能还是非常强大的.废话不多说直接上代码: [ExecuteInEditM ...

  3. 深入理解PHP内核(二)概览-PHP生命周期与Zend引擎

    本文参考自<深入理解PHP内核>,地址:https://github.com/reeze/tipi 本文链接:http://www.orlion.ml/232/ 1.SAPI接口 SAPI ...

  4. Testing - 测试基础 - 概念

    测试是为了度量和提高被测试软件的质量,对测试软件进行工程设计.实施.维护的的整个生命周期过程. 仅仅发现Bug是测试的初步,而分析出根本原因推动问题的解决,却要有很深的功底. 不同的测试岗位从事不同的 ...

  5. Nutch源码阅读进程3---fetch

    走了一遍Inject和Generate,基本了解了nutch在执行爬取前的一些前期预热工作,包括url的过滤.规则化.分值计算以及其与mapreduce的联系紧密性等,自我感觉nutch的整个流程是很 ...

  6. EasyUI treegrid 获取编辑状态中某字段的值 [getEditor方法获取不到editor]

    如题,在treegrid里,按照api里getEditor方法的说明, getEditoroptionsGet the specified editor, the options contains t ...

  7. 23套新鲜出炉的网站和手机界面 PSD 素材

    Web 用户界面,移动用户界面和线框套件对设计师很有用,因为这些套件让他们使用快速和有效的方式复制用户界面.这些类型的工具包提供了一个基本的用户界面元素,用于它们需要制作的网站或软件模型. 在这篇文章 ...

  8. Elasticsearch入门介绍

    ES是一个高扩展的.开源的.全文检索的搜索引擎,它提供了近实时的索引.搜索.分析功能. ES文档翻译与总结参考:ES知识汇总 应用场景 1 它提供了强大的搜索功能,可以实现类似百度.谷歌等搜索. 2 ...

  9. SQL Server代理(11/12):维护计划作业

    SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. 在这一系列的上一篇,我们看了使用代理帐户模 ...

  10. Twitter Bootstrap深受开发者喜爱的11大理由

    Bootstrap,作为创新技术框架,使开发者.设计者更容易.更快捷.更出色地完成网站及应用的搭建工作.如果你还没有使用Twitter Bootstrap,建议你去了解一下.Bootstrap为开发者 ...