Hibernate的查询大致分为以下三种场景,

  1.  HQL查询-hibernate Query Language(多表查询,但不复杂时使用)

    2.  Criteria查询(单表条件查询)

  3.  原生SQL查询(复杂的业务查询)

接下来解释三种使用方法:

1.HQL查询-hibernate Query Language(多表查询,但不复杂时使用)  Hibernate独家查询语言,属于面向对象的查询语言,HQL语言中不会出现SQL中的表和列,HQL使用的都是JavaBean的类名和属性名。

1.HQL基本查询

(1)查询所有的基本语句

    @Test
// HQL查询所有数据
public void fun1() {
// 1 获得session
Session session = HibernateUtil.openSession();
// 2.书写HQL语句
String hql = "from cn.qlq.domain.Customer";// from 类名全路径
// 3.根据hql创建查询对象
Query query = session.createQuery(hql);
// 4.根据查询对象获取查询结果
List<Customer> customers = query.list();
System.out.println(customers);
}

结果:

Hibernate:
select
customer0_.cust_id as cust_id1_0_,
customer0_.cust_name as cust_nam2_0_,
customer0_.cust_source as cust_sou3_0_,
customer0_.cust_industry as cust_ind4_0_,
customer0_.cust_level as cust_lev5_0_,
customer0_.cust_linkman as cust_lin6_0_,
customer0_.cust_phone as cust_pho7_0_,
customer0_.cust_mobile as cust_mob8_0_
from
cst_customer customer0_
[Customer [cust_id=1, cust_name=XXXXXXXXXX], Customer [cust_id=2, cust_name=联想]]

改进:如果整个项目中只有一个类的名字可以省略包路径,也就是可以只写类名:

    @Test
// HQL查询所有数据
public void fun1() {
// 1 获得session
Session session = HibernateUtil.openSession();
// 2.书写HQL语句
// String hql = "from cn.qlq.domain.Customer";// from 类名全路径
String hql = "from Customer";// 如果整个项目中只有这一个类名可以直接写名字
// 3.根据hql创建查询对象
Query query = session.createQuery(hql);
// 4.根据查询对象获取查询结果
List<Customer> customers = query.list();
System.out.println(customers);
}

(2)根据主键查询单个

    @Test
// HQL查询单个数据
public void fun2() {
// 1 获得session
Session session = HibernateUtil.openSession();
// 2.书写HQL语句
// String hql = "from cn.qlq.domain.Customer";// from 类名全路径
String hql = "from Customer where cust_id = 1";// where后面是Customer的属性名称而不是列名
// 3.根据hql创建查询对象
Query query = session.createQuery(hql);
// 4.根据查询对象获取查询结果
Customer customer = (Customer) query.uniqueResult();
System.out.println(customer);
}

2.HQL条件查询:

(1)?占位符查询

  类似于JDBC的占位符,只是hibernate的?下标从0开始,而JDBC的下标从1开始,基本上所有的编程索引都从0开始,唯独JDBC从1开始。。。。

    @Test
// HQL的?占位符查询
public void fun3() {
// 1 获得session
Session session = HibernateUtil.openSession();
// 2.书写HQL语句
// String hql = "from cn.qlq.domain.Customer";// from 类名全路径
String hql = "from Customer where cust_id = ?";// 如果整个项目中只有这一个类名可以直接写名字
// 3.根据hql创建查询对象
Query query = session.createQuery(hql);
// query.setLong(0, 1l);//类似于JDBC的占位符,只是JDBC的占位符下标从0开始,hibernate从1开始
query.setParameter(0, 1l);//这种写法不用管类型
// 4.根据查询对象获取查询结果
Customer customer = (Customer) query.uniqueResult();
System.out.println(customer);
}

(2)命令占位符   :name格式的查询,固定格式,name随便起,习惯性的起做和条件名字一样

    @Test
// HQL的命令占位符查询
public void fun4() {
// 1 获得session
Session session = HibernateUtil.openSession();
// 2.书写HQL语句
// String hql = "from cn.qlq.domain.Customer";// from 类名全路径
String hql = "from Customer where cust_id = :cust_id";// :cust_id的名字随便起,只不过习惯性的起做一样
// 3.根据hql创建查询对象
Query query = session.createQuery(hql);
// query.setLong(0, 1l);//类似于JDBC的占位符,只是JDBC的占位符下标从0开始,hibernate从1开始
query.setParameter("cust_id",1l);
// 4.根据查询对象获取查询结果
Customer customer = (Customer) query.uniqueResult();
System.out.println(customer);
}

3.HQL排序与分页查询

  分页查询类似于mysql的limit关键字,limit start,pageSize。。。。。。

    @Test
// HQL分页查询
public void fun5() {
// 1 获得session
Session session = HibernateUtils.openSession();
// 2.书写HQL语句
// String hql = "from cn.qlq.domain.Customer";// from 类名全路径
String hql = "from Customer order by cust_id desc";// :cust_id的名字随便起,只不过习惯性的起做一样
// 3.根据hql创建查询对象
Query query = session.createQuery(hql);
/**
* 类似于 limit start,pageSize;
* 假设页大小是2
* 页号 起始值 页大小
* 1 0 2
* 2 2 2
*/
//例如取第二页数据
query.setFirstResult(2);
query.setMaxResults(2);
// 4.根据查询对象获取查询结果
List<Customer> customers = query.list();
System.out.println(customers);
}

结果:

Hibernate:
select
customer0_.cust_id as cust_id1_0_,
customer0_.cust_name as cust_nam2_0_,
customer0_.cust_source as cust_sou3_0_,
customer0_.cust_industry as cust_ind4_0_,
customer0_.cust_level as cust_lev5_0_,
customer0_.cust_linkman as cust_lin6_0_,
customer0_.cust_phone as cust_pho7_0_,
customer0_.cust_mobile as cust_mob8_0_
from
cst_customer customer0_ limit ?,
?

[Customer [cust_id=2, cust_name=新增数据], Customer [cust_id=1, cust_name=程序员111]]

2.Criteria查询(单表条件查询)

  criteria查询相比于上面的HQL查询要简单的多。

1.基本查询---查询所有

    @Test
// 查询所有
public void test1() {
// 1 获得session
Session session = HibernateUtils.openSession();
// 2.創建criteria进行查询
Criteria criteria = session.createCriteria(Customer.class);
List<Customer> list = criteria.list();
System.out.println(list);
}

结果:

[Customer [cust_id=1, cust_name=程序员111], Customer [cust_id=2, cust_name=新增数据], Customer [cust_id=3, cust_name=测试名称222], Customer [cust_id=4, cust_name=测试名称222]]

2. 条件查询单个:

    @Test
// 根据ID查询单个,条件查询
public void test2() {
// 1 获得session
Session session = HibernateUtils.openSession();
// 2.創建criteria进行查询
Criteria criteria = session.createCriteria(Customer.class);
criteria.add(Restrictions.eq("cust_id", 1l));
Customer customer = (Customer) criteria.uniqueResult();
System.out.println(customer);
}

结果:

Customer [cust_id=1, cust_name=程序员111]

条件列表:

3.分页查询:

    @Test
// 分页查询
public void test3() {
// 1 获得session
Session session = HibernateUtils.openSession();
// 2.創建criteria进行查询
Criteria criteria = session.createCriteria(Customer.class);
/**
* 类似于 limit start,pageSize;
* 假设页大小是2
* 页号 起始值 页大小
* 1 0 2
* 2 2 2
*/
criteria.setFirstResult(2);
criteria.setMaxResults(2);
List<Customer> list = criteria.list();
System.out.println(list);
}

结果:

[Customer [cust_id=3, cust_name=测试名称222], Customer [cust_id=4, cust_name=测试名称222]]

4.排序分组使用

    @Test
// 排序和分组
public void test5() {
// 1 获得session
Session session = HibernateUtils.openSession();
// 2.排序
Criteria criteria = session.createCriteria(Customer.class);
criteria.addOrder(Order.desc("cust_id"));
List<Customer> list = criteria.list();
System.out.println(list);
System.out.println();
// 2.分组
Criteria criteria1 = session.createCriteria(Customer.class);
criteria1.setProjection(Projections.groupProperty("cust_name"));
List<Customer> list1 = criteria1.list();
System.out.println(list1);
}

结果:

[Customer [cust_id=4, cust_name=测试名称222], Customer [cust_id=3, cust_name=测试名称222], Customer [cust_id=2, cust_name=新增数据], Customer [cust_id=1, cust_name=程序员111]]

[新增数据, 测试名称222, 程序员111]

5.聚集函数查询总数

    @Test
// 查询总数(聚集函数的使用)
public void test4() {
// 1 获得session
Session session = HibernateUtils.openSession();
// 2.聚集函数查询总数
Criteria criteria = session.createCriteria(Customer.class);
criteria.setProjection(Projections.rowCount());
Long count = (Long) criteria.uniqueResult();
System.out.println(count);
// 3.聚集函数查询总数第二种方法
Criteria criteria1 = session.createCriteria(Customer.class);
criteria1.setProjection(Projections.count("cust_id"));
Long count1 = (Long) criteria.uniqueResult();
System.out.println(count1);
// 4.聚集函数查询几个不同的姓名
Criteria criteria2 = session.createCriteria(Customer.class);
criteria2.setProjection(Projections.countDistinct("cust_name"));
Long count2 = (Long) criteria2.uniqueResult();
System.out.println(count2);
}

结果:

4
4
3

3.Hibernate种的原生SQL查询(用于处理一些复杂的业务逻辑)

1.基本查询

1.查询结构是数组集合

    @Test
// 基本查询--返回数组list
public void test1() {
// 1.获取与线程绑定的session
Session session = HibernateUtils.getCurrentSession();
// 2.开启事务
Transaction tx = session.beginTransaction();
String sql = "select * from cst_customer";// 3.构造Query对象进行查询
SQLQuery sqlQuery = session.createSQLQuery(sql);
List<Object[]> list = sqlQuery.list();
for (Object[] o : list) {
System.out.println(Arrays.toString(o));
}
// 提交事务
tx.commit();
}

结果

[1, 程序员111, null, null, null, null, null, null]
[2, 新增数据, null, null, null, null, null, null]
[3, 测试名称222, null, null, null, null, null, null]
[4, 测试名称222, null, null, null, null, null, null]

2.查询结果是对象集合(重要)

    @Test
// 基本查询--返回对象list
public void test2() {
// 1.获取与线程绑定的session
Session session = HibernateUtils.getCurrentSession();
// 2.开启事务
Transaction tx = session.beginTransaction();
String sql = "select * from cst_customer";// 3.构造Query对象进行查询
SQLQuery sqlQuery = session.createSQLQuery(sql);
sqlQuery.addEntity(Customer.class);
List<Customer> list = sqlQuery.list();
System.out.println(list);
// 提交事务
tx.commit();
}

结果

[Customer [cust_id=1, cust_name=程序员111], Customer [cust_id=2, cust_name=新增数据], Customer [cust_id=3, cust_name=测试名称222], Customer [cust_id=4, cust_name=测试名称222]]

2.条件查询

    @Test
// 基本查询--返回对象list
public void test3() {
// 1.获取与线程绑定的session
Session session = HibernateUtils.getCurrentSession();
// 2.开启事务
Transaction tx = session.beginTransaction();
String sql = "select * from cst_customer where cust_id=?";// 3.构造Query对象进行查询
SQLQuery sqlQuery = session.createSQLQuery(sql);
sqlQuery.addEntity(Customer.class);
sqlQuery.setParameter(0, 1l);
Customer cus = (Customer) sqlQuery.uniqueResult();
System.out.println(cus);
// 提交事务
tx.commit();
}

结果

Customer [cust_id=1, cust_name=程序员111]

3.聚集函数查询总数

    @Test
// 基本查询--查询总数
public void test4() {
// 1.获取与线程绑定的session
Session session = HibernateUtils.getCurrentSession();
// 2.开启事务
Transaction tx = session.beginTransaction();
String sql = "select count(*) from cst_customer";// 3.构造Query对象进行查询
SQLQuery sqlQuery = session.createSQLQuery(sql);
BigInteger bg = (BigInteger) sqlQuery.uniqueResult();
System.out.println(bg);
// 提交事务
tx.commit();
}

结果

4

4.排序与分页综合查询

    @Test
// 基本查询--分页查询
public void test5() {
// 1.获取与线程绑定的session
Session session = HibernateUtils.getCurrentSession();
// 2.开启事务
Transaction tx = session.beginTransaction();
//按cust_id降序排序
String sql = "select * from cst_customer order by cust_id desc limit ?,?";// 3.构造Query对象进行查询
SQLQuery sqlQuery = session.createSQLQuery(sql);
sqlQuery.addEntity(Customer.class);
/**
* 分页查询 取第二页,页大小是二
*/
sqlQuery.setParameter(0, 2);
sqlQuery.setParameter(1, 2);
List<Customer> list = sqlQuery.list();
System.out.println(list);
// 提交事务
tx.commit();
}

结果

[Customer [cust_id=2, cust_name=新增数据], Customer [cust_id=1, cust_name=程序员111]]

4.原生SQL映射为MAP:

@Test
/**
* 原生SQL查询(SQLQuery映射查询结果为map)
*/
public void fun6(){
Session session = HibernateUtil.openSession();
Transaction tx = session.beginTransaction(); String sql = "select * from cst_customer";
SQLQuery sqlQuery = session.createSQLQuery(sql);
sqlQuery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
System.out.println(sqlQuery.list()); tx.commit();
session.close();
}

结果:

[{cust_phone=null, cust_name=测试名称1, cust_mobile=null, cust_linkman=null, cust_industry=null, cust_level=null, cust_source=null, cust_id=7}, {cust_phone=null, cust_name=测试名称2, cust_mobile=null, cust_linkman=null, cust_industry=null, cust_level=null, cust_source=null, cust_id=8}, {cust_phone=null, cust_name=测试名称3, cust_mobile=null, cust_linkman=null, cust_industry=null, cust_level=null, cust_source=null, cust_id=9}, {cust_phone=null, cust_name=测试名称4, cust_mobile=null, cust_linkman=null, cust_industry=null, cust_level=null, cust_source=null, cust_id=10}, {cust_phone=null, cust_name=测试名称5, cust_mobile=null, cust_linkman=null, cust_industry=null, cust_level=null, cust_source=null, cust_id=11}, {cust_phone=null, cust_name=测试名称6, cust_mobile=null, cust_linkman=null, cust_industry=null, cust_level=null, cust_source=null, cust_id=12}, {cust_phone=null, cust_name=测试名称7, cust_mobile=null, cust_linkman=null, cust_industry=null, cust_level=null, cust_source=null, cust_id=13}]

5.hibernate原生SQL进行插入操作

    @Test
// 原生SQL执行插入操作
public void test6() {
// 1.获取与线程绑定的session
Session session = HibernateUtils.getCurrentSession();
// 2.开启事务
Transaction tx = session.beginTransaction();
String sql = "insert into user values('xxxx','李四',23)";;// 3.构造Query对象进行插入
SQLQuery sqlQuery = session.createSQLQuery(sql);
sqlQuery.executeUpdate();
// 提交事务
tx.commit();
}

Hibernate的批量查询的更多相关文章

  1. Hibernate的批量查询——HQL

    HQL(Hibernate Query Language)查询: 1.查询所有学生信息: public static void testSel() { Session session = Hibern ...

  2. Hibernate的批量查询——Criteria查询所有、条件、分页、统计(聚合函数)、排序

    1.查询所有的学生信息: public static void testSel() { Session session = HibernateUtils.openSession(); Transact ...

  3. Hibernate的批量查询——原生sql查询

    1.查询所有的学生信息: (1)查询结果中,一条信息放入到一个数组中,从list集合中取出数组,并对数组进行遍历. public class GeneratorTest { public static ...

  4. 【JAVAEE学习笔记】hibernate02:实体规则、对象状态、缓存、事务、批量查询和实现客户列表显示

    一.hibernate中的实体规则 实体类创建的注意事项 1.持久化类提供无参数构造 2.成员变量私有,提供共有get/set方法访问.需提供属性 3.持久化类中的属性,应尽量使用包装类型 4.持久化 ...

  5. Hibernate三大类查询总结

    Hibernate目前总共分为三大类查询:cretiria,hql,本地sql [以下篇章搜集于网络,感谢作者] 第一:关于cretiria的查询 具有一个直观的.可扩展的条件查询API是Hibern ...

  6. Hibernate Query Language查询:

    Hibernate Query Language查询: Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Language)查询提供 ...

  7. JAVAEE学习——hibernate02:实体规则、对象状态、缓存、事务、批量查询和实现客户列表显示

    一.hibernate中的实体规则 实体类创建的注意事项 1.持久化类提供无参数构造 2.成员变量私有,提供共有get/set方法访问.需提供属性 3.持久化类中的属性,应尽量使用包装类型 4.持久化 ...

  8. Hibernate的批量抓取

    批量抓取理解:如果我们需要查找到客户的所有联系人的话,按照正常的思路,一般是首先查询所有的客户,得到返回的客户的List集合.然后遍历List集合,得到集合中的每一个客户,在取出客户中的联系人(客户表 ...

  9. hibernate框架之-查询结果集返回类型

    Hibernate支持HQL和SQL的查询,返回结果支持POJO类型或字段/数组的形式. 开发中用Hibernate进行数据库查询,用的是SQL.原来需要查询一个表的几乎所有字段,所以我使用了addE ...

随机推荐

  1. BFS和DFS算法

    昨晚刚昨晚华为笔试题,用到了BFS和DFS,可惜自己学艺不精,忘记了实现原理,现在借用大佬写的内容给自己做个提高 转自:https://www.jianshu.com/p/70952b51f0c8 图 ...

  2. MFC Cstring转化为string

    Cstring m_filePath; string sname( CW2A( m_filePath.GetString())); http://blog.sina.com.cn/s/blog_530 ...

  3. WPF和js交互 调用窗体中的方法

    public partial class WebTest: Window { private void Window_ContentRendered(object sender, EventArgs ...

  4. [2017BUAA软工]结对项目-数独程序扩展

    零.github地址 GitHub地址:https://github.com/Liu-SD/SudoCmd (这个地址是命令行模式数独的仓库,包含了用作测试的BIN.DLL核心计算模块地址是:http ...

  5. 转帖:Android 官方推荐 : DialogFragment 创建对话框

    转: Android 官方推荐 : DialogFragment 创建对话框 复制内容,留作备份 1. 概述 DialogFragment在android 3.0时被引入.是一种特殊的Fragment ...

  6. 题解 P2580 【于是他错误的点名开始了】

    这个题的题解区就没一简单一点的指针题解?(大概是瞎了) So,这篇题解是给那些想用指针而害怕的同学食用的qwq 记得有一篇题解有个dalao作者放了几个静态模拟的trie树结果最后放了个动态的跑路了. ...

  7. Dubbo 生态添新兵,Dubbo Admin 发布 v0.1

    为了提升 Dubbo 里程碑版本2.7.0的使用体验,我们于去年年中启动了 Dubbo Admin 的重构计划,并作为Dubbo生态的子项目,于近期发布了v0.1,重构后的项目在结构上的变化如下: 将 ...

  8. net 和Mono 构建的HTTP服务框架

    Nancy是一个基于.net 和Mono 构建的HTTP服务框架,是一个非常轻量级的web框架. 设计用于处理 DELETE, GET, HEAD, OPTIONS, POST, PUT 和 PATC ...

  9. NOIP2018初赛提高组复习提纲(By HGOI LJC)

    Download:https://pan.baidu.com/s/16khhFf_0RsUjJLETreb20w (PDF) https://pan.baidu.com/s/1BVZqLs3q1clZ ...

  10. 洛谷 P4389 付公主的背包 解题报告

    P4389 付公主的背包 题目背景 付公主有一个可爱的背包qwq 题目描述 这个背包最多可以装\(10^5\)大小的东西 付公主有\(n\)种商品,她要准备出摊了 每种商品体积为\(V_i\),都有\ ...