在hibernate中进行多表查询,每个表中各取几个字段,也就是说查询出来的结果集并没有一个实体类与之对应,如何解决这个问题?
解决方案一,按照Object[]数据取出数据,然后自己组bean
解决方案二,对每个表的bean写构造函数,比如表一要查出field1,field2两个字段,那么有一个构造函数就是Bean(type1
filed1,type2 field2) ,然后在hql里面就可以直接生成这个bean了。具体怎么用请看相关文档。

本笔记继续使用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
刘德华
贺龙
白百何
文章
林月如

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

  1. Hibernate笔记——hql总结

    原文:http://www.cnblogs.com/xiaoluo501395377/p/3376256.html ------------------------------------------ ...

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

            thinkphp 3.2快捷查询OR查询&分割表示AND查询讲解         快捷查询方式是一种多字段查询的简化写法,可以进一步简化查询条件的写法,在多个字段之间用|分割表 ...

  3. 【mysql】 mybatis实现 主从表 left join 1:n 一对多 分页查询 主表从表都有查询条件 【mybatis】count 统计+JSON查询

    mybatis实现 主从表 left join  1:n 一对多 分页查询   主表从表都有查询条件+count 需求: ======================================= ...

  4. php查询mysql数据库 查询条件替中文字符串变量时无法查询

    $temp2 ='十年';mysql_query("SET NAMES GBK"); $res = mysql_query("select songer_name fro ...

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

    要查询的数据结构例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ2FvMzY5NTE=/font/5a6L5L2T/fontsize/400/f ...

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

    一.一对多操作 1.构造实体类及编写配置文件:     一方:  // 一个Customer对应多个linkman private Set<Linkman> linkmans = new ...

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

    目录 一对多 表之间关系 表之间关系建表原则 一对多关系配置 建立表 建立ORM 添加配置文件 在hibernate.cfg.xml中的标签里,添加核心配置文件 引入工具类 编写测试类 级联操作 什么 ...

  8. django orm 的查询条件

    Django的ORM查询操作: 查询数据库操作是一个非常重要的技术.在Django中,查询一般就是使用filter.exclude.get三个方法来实现,在调用这些方法的时候传递不同的查询条件来实现复 ...

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

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

随机推荐

  1. SIT&UAT

  2. 这么大一座Azure“图书馆”,你竟没有发现…

    为避免被叫做「伸手党」,很多技术人员早已养成遇到问题上网搜的好习惯. 然而…… 同一个概念,搜到两个相互矛盾的解释,以谁的为准? 想查找某个 API 的用法,搜索结果数十万条,怎样筛选出最有价值的? ...

  3. 对InitialContext的理解

        类InitialContext java.lang.Object   javax.naming.InitialContext 此类是执行命名操作的初始上下文. 所有命名操作都相对于某一上下文. ...

  4. [论文笔记] A Practical Architecture of Cloudification of Legacy Applications (2011, SERVICES)

    Dunhui Yu, Jian Wang, Bo Hu, Jianxiao Liu, Xiuwei Zhang, Keqing He, and Liang-Jie Zhang. 2011. A Pra ...

  5. (二)SpringMVC之执行的过程

    (DispatcherServlet在Spring当中充当一个前端控制器的角色,它的核心功能是分发请求.请求会被分发给对应处理的Java类,Spring MVC中称为Handle.) ①   用户把请 ...

  6. QT5:先导篇 全局定义

    一.简介 <QtGlobal>头文件包含了Qt类库的一些全局定义,包含基本数据类型 函数和宏 二.全局变量定义 <QtGlobal>定义的数据类型: Qt数据类型        ...

  7. 使用gcc -g编译,gdb调试时仍然存在“no debug symbols found”的错误

    今天为调试一段代码,使用gcc将程序用-g选项重新编译.但是使用gdb进行debug时,仍然出现“no debug symbols found”的错误.仔细检查了一下Makefile,原来后面定义的连 ...

  8. PAT 乙级 1005

    题目 题目地址:PAT 乙级 1005 题解 本题主要就在于将一个数的一系列计算结果不重复地存储起来并便于检索,考虑到STL中的集合有相似的特性,使用set可以有效地简化代码和运算. 过程如下: (初 ...

  9. [LUOGU] P1063 能量项链

    题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定 ...

  10. 【Java_多线程并发编程】基础篇—线程状态及实现多线程的两种方式

    1.Java多线程的概念 同一时间段内,位于同一处理器上多个已开启但未执行完毕的线程叫做多线程.他们通过轮寻获得CPU处理时间,从而在宏观上构成一种同时在执行的假象,实质上在任意时刻只有一个线程获得C ...