Hibernate 笔记 HQL查询 条件查询,聚集函数,子查询,导航查询

本笔记继续使用dept部门表,emp员工表,一对多多对一双向映射。

1 条件查询

1.1    查询 员工表emp中 年龄eage小于30,月薪esal大于20000的员工姓名ename

sql:select ename from emp where eage<? and esal >?;

hql: select ename from Emp where eage<? and esal >?

1.2 问号的设置与别名

问号(?)的设置使用.setParameter(位置, 属性值) 在sql语句中问号的位置是从1开始,在hql中从零开始。

在hql中,问号(?)也可以起别用,:后面紧跟别名,setParameter("age",
30)方法也随之改变,将原先的数字改成"别名",如下所示

String
hql="select ename from Emp where eage<:age and esal
>:sal";
          
  Query query= session.createQuery(hql).setParameter("age",
30).setParameter("sal", 20000f).list();

1.3   一组问号的设置

对于一组问号也可以设置别名:如 查询在1,2部门的员工姓名

hql="select ename from Emp where did in (?,?)";

hql="select
ename from Emp where did in (:d)";

Query
query= session.createQuery(hql).setParameter("d", new Object[]{1,2}).list();


public void Test9() throws Exception{ 
Configuration config=new Configuration().configure();
SessionFactory sessionFactory= config.buildSessionFactory();
Session session=null;
Transaction tr=null;
try{
session= sessionFactory.openSession();
tr=session.beginTransaction();
String hql="select ename from Emp where eage<? and esal >?";
Query query= session.createQuery(hql).setParameter(0, 30).setParameter(1, 20000f); //设置问号,从0开始。
List<String> list = query.list();
for(String message:list){
System.out.println(message);
}
tr.commit();
}catch(Exception e){
tr.rollback();
}finally{
if(session!=null){
session.close();
}
if(sessionFactory!=null){
sessionFactory.close();
}
}
}

复制代码

结果:

Hibernate: select emp0_.ename as col_0_0_ from emp emp0_ where
emp0_.eage<? and emp0_.esal>?
刘亦菲
白百何
文章
林月如

2 条件查询的常用关键字

2.1  distinct  过滤重复的值

查询员工表中的所有员工姓名,并去掉重复值

hql="select distinct  ename from Emp ";

2.2  delete   删除

删除年龄大于25的员工

    hql="delete Emp where eage>25"; 删除年龄大于25岁的用户

Query
query=session.createQuery(hql);

    
 query.executeUpdate();          
//执行  executeUpdate 方法返回int类型。

      tx.commit();    
       //成功,则提交,对数据库操作

2.3  update 更新

更新员工编号11的年龄为22

    String hql="update Emp s set s.eage=‘22‘ where s.eid=11";  
//更新语句

    Query query=session.createQuery(hql);

query.executeUpdate();          
//执行

tx.commit();          
//成功,则提交

2.4  between...and...和not between...
and...确定查询范围

查找员工表中年龄在20到30之间的员工姓名

hql="select ename from
Emp where eage between 20 and 30"

  2.5  in和not in确定查询集合

查询员工属于低1,2部门的员工姓名

hql="select ename from
Emp where did in(1,2)"

2.6  like进行模糊查询

用like进行模糊查询时有两个可用的通配符:“%”和“_”。“%”代表长度大于等于0的字符,“_”代表长度为1的单个字符。

查询员工表中姓名中带有刘的员工

hql="select ename from
Emp where ename  like ‘%刘%‘"

2.7  逻辑与 and 逻辑或 or

查询员工中薪水大于2000
同时年龄小于30的员工姓名

hql="select ename
from Emp where esal>2000 and eage<30";

查询员工中,年龄大于40或者年龄小于30的员工

hql="select
ename  from Emp where eage>40 or eage<30";

2.8  order by对结果进行排序

对薪水进行排序,从小到大

hql="select esal from
Emp where order by esal asc";

对年龄进行排序,倒叙,

hql="select ename from Emp
where order by eage desc";

2.9  group by对记录进行分组

根据部门分组,求出各组的平均薪水

hql=" select avg(esal) from
Emp group by did";

2.10 having 对分组进行筛选

根据部门分组,查出员工所在组平均薪水大于10000的员工姓名

hql=" select ename
from Emp group by did having  avg(esal)>10000";

3 聚集函数

查询emp员工表中有多少个员工。

sql:select count(ename) from emp;

hql: select count(ename) from Emp;

聚集函数及含义:

hql: select avg(esal) from Emp;   薪水平均值

hql: select max(esal) from Emp;  薪水最大值

hql: select sum(esal) from Emp;  薪水最小值


    public void Test91() throws Exception{ 
Configuration config=new Configuration().configure();
SessionFactory sessionFactory= config.buildSessionFactory();
Session session=null;
Transaction tr=null;
try{
session= sessionFactory.openSession();
tr=session.beginTransaction();
String hql="select count(ename) from Emp";
Object count=session.createQuery(hql).uniqueResult(); //uniqueResult()方法返回Object类型 
System.out.println(count);

tr.commit();
}catch(Exception e){
tr.rollback();
}finally{
if(session!=null){
session.close();
}
if(sessionFactory!=null){
sessionFactory.close();
}
}
}

复制代码

结果:

Hibernate: select count(emp0_.ename) as col_0_0_ from emp emp0_
15

 4 子查询

Hibernate 支持子查询,所谓子查询就是,要查询的字段及信息在A表,条件在B表。语法与sql语句相似。


public void Test9() throws Exception{ 
Configuration config=new Configuration().configure();
SessionFactory sessionFactory= config.buildSessionFactory();
Session session=null;
Transaction tr=null;
try{
session= sessionFactory.openSession();
tr=session.beginTransaction();

String hql="select ename from Emp where did in (select did from Dept where daddress = 302)";
Query query= session.createQuery(hql);
List<String> list = query.list();
for(String message:list){
System.out.println(message);
}
tr.commit();
}catch(Exception e){
tr.rollback();
}finally{
if(session!=null){
session.close();
}
if(sessionFactory!=null){
sessionFactory.close();
}
}
}

复制代码

结果:

Hibernate: select emp0_.ename as col_0_0_ from emp emp0_ where did in (select
dept1_.did from dept dept1_ where
dept1_.daddress=302)
李世民
曹操
和珅
刘诗诗

5 导航查询

e.dept.daddress=301

员工所在部门的地址是301


public void Test9() throws Exception{ 
Configuration config=new Configuration().configure();
SessionFactory sessionFactory= config.buildSessionFactory();
Session session=null;
Transaction tr=null;
try{
session= sessionFactory.openSession();
tr=session.beginTransaction();

String hql="select ename from Emp e where e.dept.daddress=301 ";
Query query= session.createQuery(hql);
List<String> list = query.list();
for(String message:list){
System.out.println(message);
}
tr.commit();
}catch(Exception e){
tr.rollback();
}finally{
if(session!=null){
session.close();
}
if(sessionFactory!=null){
sessionFactory.close();
}
}
}

复制代码

结果:

Hibernate: select emp0_.ename as col_0_0_ from emp emp0_, dept dept1_ where
emp0_.did=dept1_.did and
dept1_.daddress=301
刘德华
贺龙
白百何
文章
林月如

时间: 2024-10-03 19:47:43

Hibernate 笔记 HQL查询 条件查询,聚集函数,子查询,导航查询的相关文章

Thinkphp 查询条件 and 和 or同时使用即复合查询

        thinkphp 3.2快捷查询OR查询&分割表示AND查询讲解         快捷查询方式是一种多字段查询的简化写法,可以进一步简化查询条件的写法,在多个字段之间用|分割表示OR查询,用&分割表示AND查询,可以实现下面的查询,例如:         一.不同字段相同的查询条件 $User = M("User"); // 实例化User对象             $map['name|title'] = 'thinkphp';           

查询条件左边写入函数,导致无法命中索引

背景: 简单罗列下之前做过的优化,人懒. 所以没能把所有的整理统一放出来. 情况: 系统查询过慢,没能命中索引. <!--对账单数量 --> <select id="selectCount" resultType="java.lang.Integer" parameterType="map">     select count(*) from monthly_statements where store_id = #{st

MongoDB中关于查询条件中包括集合中字段的查询

要查询的数据结构例如以下: 以查询当中的versionLimitList字段为例 MongoOperations工具类查询相关语句 <pre name="code" class="java">Criteria criteria1 = Criteria.where("validStartTime").gt(new Date()). and("versionLimitList").elemMatch (Criteria

MongoDB中关于查询条件中包含集合中字段的查询

要查询的数据结构如下: 以查询其中的versionLimitList字段为例 MongoOperations工具类查询相关语句 <pre name="code" class="java">Criteria criteria1 = Criteria.where("validStartTime").gt(new Date()). and("versionLimitList").elemMatch (Criteria.w

Hibernate笔记3--多表操作-导航查询

一.一对多操作 1.构造实体类及编写配置文件:     一方: 1 // 一个Customer对应多个linkman 2 private Set<Linkman> linkmans = new HashSet<>(0); 配置: 1 <!-- inverse="true"代表放弃外键维护权 --> 2 <set name="linkmans" inverse="true"> 3 <!-- 配置

三大框架 之 Hibernate查询(一对多、多对多、查询关系)

目录 一对多 表之间关系 表之间关系建表原则 一对多关系配置 建立表 建立ORM 添加配置文件 添加核心配置文件 引入工具类 编写测试类 级联操作 什么是级联 级联分类 级联是有方向性 级联保存或更新 级联删除 在双向级联的过程当中,会产生一些多余的sql语句 lazy懒加载(默认值是proxy,不自动获取外键对象) 级联保存或更新(解决 瞬时对象异常,只保存一边) 多对多 多对多关系配置 建立表 建立ORM 添加配置文件 在核心配置文件当中添加两个新配置 编写测试类 多对多的操作 查询方式 O

[原创]java WEB学习笔记23:MVC案例完整实践(part 4)---模糊查询的设计与实现

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

查询表格——建立动态表格,使用ajax输入查询条件将后台数据查询出来以表格的形式展示出来

建立动态表格,使用ajax将前台查询条件传给后台,并将查询结果以表格的形式展示出来. 页面的展示效果如下图所示: 第一步:查询条件的部分: 代码如下: <div class="text-c"> <span style="text-indent: 2em;display: inline-block;font-size:20px">账号:</span> <input type="text" name=&quo

关于实现数据查询条件输入功能的一个低级错误

我们常常要实现检索数据的功能.复杂的查询条件输入,最好有辅助输入功能,能帮助使用者更轻松的完成查询条件输入.最近我们见到一个查询条件输入功能实现的时候犯的一个低级错误,觉得在新手中可能会典型,故拿出来说一下. 有个查询基站监控历史数据的功能,要查基站的历史数据,先得选择几个基站.第一个版本查询条件很简单,只需按站名或地区搜索基站,在结果集中选中一个或多个站,再输入其他查询条件.第二个版本,客户要求增加基站的基础信息作为查询条件,比如郊区还是市区,墙体材料等等,这些条件影响基站的冷却所需的能耗.这