Hibernate中提供了HQL、QBC以及SQL的三种形式查询,HQL查询是一种根据映射文件的便捷查询,只要写部分SQL语句即可。QBC查询则是借助Criteria 进行快捷的查询。SQL查询是基于SQL语句的查询

以下案例用于查询的两个表结构

CREATE TABLE `department` (
  `id` int(2) NOT NULL AUTO_INCREMENT,
  `NAME` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

CREATE TABLE `employee` (
  `Id` int(2) NOT NULL AUTO_INCREMENT,
  `NAME` varchar(30) DEFAULT NULL,
  `SALARY` float(10,2) DEFAULT NULL,
  `EMAIL` varchar(30) DEFAULT NULL,
  `DEPT_Id` int(2) DEFAULT NULL,
  PRIMARY KEY (`Id`),
  KEY `dept_id_fk` (`DEPT_Id`),
  CONSTRAINT `dept_id_fk` FOREIGN KEY (`DEPT_Id`) REFERENCES `department` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

department实体以及映射文件

public class Department implements java.io.Serializable {private static final long serialVersionUID = 1L;private Integer id;private String name;private Set<Employee> employees = new HashSet<>();
}
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping><class name="com.zhuojing.hibernate.hql.holleworld.Department" table="department" catalog="hibernate2"><id name="id" type="java.lang.Integer"><column name="id" /><generator class="identity" /></id><property name="name" type="java.lang.String"><column name="NAME" length="30" /></property><set name="employees" inverse="true"><key><column name="DEPT_Id" /></key><one-to-many class="com.zhuojing.hibernate.hql.holleworld.Employee" /></set></class>
</hibernate-mapping>

employee实体以及映射文件

public class Employee implements java.io.Serializable {private static final long serialVersionUID = 1L;private Integer id;private Department department;private String name;private Float salary;private String email;
}
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping><class name="com.zhuojing.hibernate.hql.holleworld.Employee" table="employee" catalog="hibernate2"><id name="id" type="java.lang.Integer"><column name="Id" /><generator class="identity" /></id><many-to-one name="department" class="com.zhuojing.hibernate.hql.holleworld.Department" fetch="select"><column name="DEPT_Id" /></many-to-one><property name="name" type="java.lang.String"><column name="NAME" length="30" /></property><property name="salary" type="java.lang.Float"><column name="SALARY" precision="5" scale="0" /></property><property name="email" type="java.lang.String"><column name="EMAIL" length="30" /></property></class><!-- 配置命名方式检查的 SQL 语句 --><query name="salaryEmp"><![CDATA[FROM Employee e WHERE e.salary > :minSay AND e.salary < :maxSay]]></query>
</hibernate-mapping>

一、HQL

1.命名参数:

@Test
public void testHQLParameter(){//1. 创建 Query 对象//基于命名参数String hql = "FROM Employee e WHERE e.salary > :sal AND e.email LIKE :email";Query query = session.createQuery(hql);//2. 绑定参数query.setFloat("sal", 7000).setString("email", "%com");//3. 执行查询List<Employee> employees = query.list();System.out.println(employees.size());}

2.分页查询

@Test
public void testPageQuery(){String hql = "FROM Employee";Query query = session.createQuery(hql);int pageNo = 3;int pageSize = 2;List<Employee> employees = query.setFirstResult((pageNo -1 )*pageSize).setMaxResults(pageSize).list();System.out.println(employees.toString());
}

3.命名方式:在映射文件中写SQL

//*映射文件
<!-- 配置命名方式检查的 SQL 语句 --><query name="salaryEmp"><![CDATA[FROM Employee e WHERE e.salary > :minSay AND e.salary < :maxSay]]></query>
*/
@Testpublic void testNamedQuery(){Query query = session.getNamedQuery("salaryEmp");List<Employee> employees = query.setFloat("minSay", 6000).setFloat("maxSay", 10000).list();System.out.println(employees.size());}

4.查找部分属性

@Test
public void testFieldQuery(){String hql = "SELECT e.name, e.email, e.department FROM Employee e WHERE e.department = :dept";Query query = session.createQuery(hql);Department department = new Department();department.setId(3);List<Object[]> objects = query.setEntity("dept", department).list();for(Object[] obj : objects){System.out.println(Arrays.asList(obj));}
}

5.查找部分属性,返回结果为一个实体类:实体类需要提供对应的构造方法

@Test
public void testFieldQuery2(){String hql = "SELECT new Employee(e.name, e.email, e.department) FROM Employee e WHERE e.department = :dept";Query query = session.createQuery(hql);Department department = new Department();department.setId(3);List<Employee> employees = query.setEntity("dept", department).list();for(Employee employee : employees){System.out.println(employee);}}

6.迫切左外连接:使用LEFT JOIN FETCH 进行迫切左外连接

用于:查询一个实体的一个实体类的成员变量时,不会在使用 SQL 语句去查询,在第一次就将结果初始化好

@Test
public void testLeftJoinFetch(){String hql = "FROM Department d LEFT JOIN FETCH d.employees";Query query = session.createQuery(hql);List<Department> departments = query.list();departments = new ArrayList<>(new LinkedHashSet<>(departments));for(Department department : departments){System.out.println(department.getName() +"--"+department.getEmployees().size());}}

7.左外连接

@Test
public void testLefJoin(){String hql = "SELECT DISTINCT d FROM Department d LEFT JOIN d.employees";Query query = session.createQuery(hql);List<Department> departments = query.list();for(Department department : departments){System.out.println(department.getName() +"--"+department.getEmployees().size());}}

二、QBC查询主要使用Criteria进行查询

1.QBC的HelloWorld

@Testpublic void testQBC(){//创建一个 Criteria 对象Criteria criteria = session.createCriteria(Employee.class);//2.添加查询条件:在QBC 中查询条件使用 Criterion 表示// Criterion 可以通过Restrictions 的静态方法得到criteria.add(Restrictions.eq("email", "bb@zhuoojing.com"));criteria.add(Restrictions.ge("salary", 6000F));//3.执行查询Employee employee = (Employee)criteria.uniqueResult();System.out.println(employee);}

2.QBC 统计查询:

@Testpublic void testQBC3(){Criteria criteria= session.createCriteria(Employee.class);//统计查询:使用 Projection 来表示:可以由 Projections 的静态方法得到criteria.setProjection(Projections.max("salary"));//Employee employee = (Employee)criteria.uniqueResult();System.out.println(criteria.uniqueResult());}

3.排序和分页

@Test
public void testQBC4(){Criteria criteria = session.createCriteria(Employee.class);//添加排序criteria.addOrder(Order.asc("salary"));criteria.addOrder(Order.desc("email"));List<Employee> employees = criteria.list();System.out.println(employees);//2.添加分页方法int pageSize = 2;int pageNo = 3;Criteria criteria3 = session.createCriteria(Employee.class);criteria3.setFirstResult((pageNo - 1) *pageSize).setMaxResults(pageSize);List<Employee> employees2 = criteria3.list();System.out.println(employees2);}

三、SQL查询(使用sql语句)

@Testpublic void testNativeSQL(){//String sql = "INSERT INTO employee(NAME,SALARY,EMAIL,DEPT_Id) VALUES('ZZ',7000,'zz@zhuojing.com',5)";String sql = "INSERT INTO department(NAME) VALUES('ZHUOJING')";Query query = session.createSQLQuery(sql);/*query.setString(0, "ZZ").setFloat(1, 7000F).setString(2, "zz@zhuojing.com").setInteger(3, 4).executeUpdate();*/query.executeUpdate();}

Hibernate--HQL、QBC以及本地SQl查询相关推荐

  1. hibernate将本地SQL查询结果封装成对象

    hibernate将本地SQL查询结果封装成对象 不知道大家有没有碰过这种情况,迫于很多情况只能用native SQL来查询(如:复杂统计等),然而使用native查询后,结果会被放到object里, ...

  2. Hibernate本地SQL查询SQLQuery

    http://callan.iteye.com/blog/156127 使用SQLQuery 对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQu ...

  3. hibernate HQL 使用from (select ……)子查询的方法

    今天徒弟用到了一句复杂的查询语句....结果执行报错,但是在SQL中执行没有问题,于是来求助我了... 语句的HQL/SQL格式如下: select count(1) ,cxltype,sum(dzs ...

  4. 使用HIBERNATE的SQL查询并将结果集自动转换成POJO

    在某些场合下,我们可能想使用HIBERNATE的框架提供的SQL查询接口,但是,由于实体没有做映射,HIBERNATE不能把结果集转换成你想要的List<POJO>,本文讨论如何在这种情况 ...

  5. Hibernate SQL 查询

    本文转载自:https://www.cnblogs.com/li3807/p/6358386.html Hibernate 支持使用原生的SQL查询,使用原生SQL查询可以利用某些数据库特性,原生SQ ...

  6. Hibernate之检索方式(HQL/QBC/本地SQL)

    一.概述 Hibernate提供了以下几种检索对象的方式 导航对象图:根据已经加载的对象导航到其它对象 OID:按照对象的OID来检索对象 HQL:使用面向对象的HQL查询语句 QBC:使用QBC(Q ...

  7. Hibernate学习之路(十三):Hibernate中的QBC查询和本地sql操作

    什么是hibernate的QBC查询 QBC 查询就是通过使用 Hibernate 提供的 Query By Criteria API 来查询对象,这种 API 封装了 SQL 语句的动态拼装,对查询 ...

  8. Hibernate 学习笔记(二)—— Hibernate HQL查询和 QBC 查询

    目录 一.Hibernate 的 HQL 查询 1.1.查询所有数据 1.2.条件查询 1.3.排序查询 1.4.统计查询 1.5.分页查询 1.6.投影查询 二.Hibernate 的 QBC 查询 ...

  9. Hibernate 查询方式(HQL/QBC/QBE)汇总

    作为老牌的 ORM 框架,Hibernate 在推动数据库持久化层所做出的贡献有目共睹. 它所提供的数据查询方式也越来越丰富,从 SQL 到自创的 HQL,再到面向对象的标准化查询. 虽然查询方式有点 ...

最新文章

  1. 一个 Blink 小白的成长之路
  2. KerGNNs:结合Graph kernels的可解释GNN
  3. mysql img格式缩放,再学 GDI+[89]: TGPImage(9) - 图像缩放时的质量(算法)
  4. 服务器托管租用商考虑什么
  5. Python 并发编程之使用多线程和多处理器
  6. 手把手教你玩转SOCKET模型:完成例程(Completion Routine)篇
  7. java编写简单邮件_Javamail,编写简单的程序发送邮件
  8. 重构随笔——重构的原则
  9. CISCO无线AP配置手册
  10. CSS知识点补充收集
  11. mysql在缺省状态下_MYSQL面试题
  12. CSS3属性——(二)
  13. 超级实况服务器维护中,超级实况最新版攻略
  14. matlab中的uicontrol,Matlab的uicontrol出错
  15. 海康 hikvision SDK 初始化、登录、布防、监听
  16. 拼多多砍价群大王:拼多多为什么3年就能上市?
  17. 南阳oj STL分类练习
  18. [教程]安装青鸟云Web服务器
  19. 我坚持写公众号的初衷是什么?
  20. String.intern()

热门文章

  1. 谷歌浏览器被hao123网站劫持穿该怎么办【已解决】
  2. pandas用法总结
  3. 远程桌面不能复制和粘贴
  4. Java中集合的基本使用
  5. 胸水细胞行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  6. python安装库命令
  7. MySQL安装失败清理以及MySQL卸载全面教程
  8. JS观察者模式和发布订阅模式的区别
  9. gitmodel学习笔记(一):利用sympy分析高等数学
  10. 百趣代谢组学实验室分享-细胞培养避坑指南