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 获得sessionSession 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: selectcustomer0_.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_ fromcst_customer customer0_
[Customer [cust_id=1, cust_name=XXXXXXXXXX], Customer [cust_id=2, cust_name=联想]]

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

    @Test// HQL查询所有数据public void fun1() {// 1 获得sessionSession 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 获得sessionSession 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 获得sessionSession 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 获得sessionSession 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 获得sessionSession 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: selectcustomer0_.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_ fromcst_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 获得sessionSession 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 获得sessionSession 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 获得sessionSession 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 获得sessionSession 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 获得sessionSession 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// 基本查询--返回数组listpublic void test1() {// 1.获取与线程绑定的sessionSession 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// 基本查询--返回对象listpublic void test2() {// 1.获取与线程绑定的sessionSession 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// 基本查询--返回对象listpublic void test3() {// 1.获取与线程绑定的sessionSession 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.获取与线程绑定的sessionSession 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.获取与线程绑定的sessionSession 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.获取与线程绑定的sessionSession 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();}

转载于:https://www.cnblogs.com/qlqwjy/p/9357369.html

Hibernate的批量查询相关推荐

  1. hibernate批量查询_使用Hibernate批量获取

    hibernate批量查询 如果需要从Java处理大型数据库结果集,则可以选择JDBC,以提供所需的低级控制. 另一方面,如果您已在应用程序中使用ORM,则回退到JDBC可能会带来一些额外的麻烦. 在 ...

  2. Hibernate 笔记 HQL查询

    http://www.cnblogs.com/zilong882008/archive/2011/11/05/2237123.html Hibernate 笔记 HQL查询(一)单属性,多属性查询 H ...

  3. 什么是hibernate N+1查询

    在Session的缓存中存放的是相互关联的对象图.默认情况下,当Hibernate从数据库中加载Customer对象时,会同时加载所有关联的Order对象.以Customer和Order类为例,假定O ...

  4. mongo go 查询指定字段_Go语言 操作MongoDB数据库批量查询

    数据操作是编程中避免不了的操作,这也就牵扯到了数据库的增删改查,而实际工作中我们最常用到的是增改查.今天要介绍的是Go 语言查询MongoDB数据库. 操作mongodb使用的包是"http ...

  5. SAP IQ09 可以批量查询序列号数据

    SAP IQ09 可以批量查询序列号数据 事务代码IQ09,输入物料号等信息, 执行, 修改Layout,增加显示'批次'与'库存批次'字段信息, 回车, 正常情况下,物料的序列号主数据里,主批次字段 ...

  6. Hibernate(九)HQL查询

    一.Hibernate提供的查询方式 OID查询方式:主键查询.通过get()或者load()方法加载指定OID的对象查询结果为一个 HQL查询方式:通过Query接口使用HQL语言进行查询 QBC查 ...

  7. Hibernate:SQL查询 addScalar()或addEntity()

      Hibernate除了支持HQL查询外,还支持原生SQL查询. 对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口.该 ...

  8. 2批量批量查询数据插入数据_Excel如何快速对数据批量查询,vlookup+match函数高效完成工作...

    工作中当出现匹配多次数据时,此时我们就需要更改vlookup函数的第三参数,更改查询的列数.此时你是否在想我手动改就可以了.当然如果查询次数不多时,这也是一种方法.下面将用vlookup+match一 ...

  9. elasticsearch版本不同,批量查询也不相同

    网上搜到批量查询可以通过TransportClient实现,但官方推荐使用RestHighLevelClient实现 注意: We plan on deprecating the TransportC ...

最新文章

  1. SpringCloud系列十二:SpringCloudSleuth(SpringCloudSleuth 简介、SpringCloudSleuth 基本配置、数据采集)...
  2. 红旗桌面版本最新应用方式和成绩解答100例-5
  3. Laravel Scheduling Package
  4. 1.5 不同类型的循环网络-深度学习第五课《序列模型》-Stanford吴恩达教授
  5. Java 接口和抽象类可以被new么?
  6. linux 恢复数据
  7. 掌握了开源框架还不够,你更需要掌握源代码
  8. pycharm console日志如何输出到txt_Django实战2-自动化运维之配置管理-04:知识扩展-logging日志模块...
  9. 本周个人进步要点20160821
  10. axios.all()解决并发请求的问题
  11. 从git repo分支安装pip
  12. 天梯—计算指数(C语言)
  13. cvi调用matlab dll,cvi通过artix调用matlab
  14. python_字符串常用方法
  15. Zemax—波长1550nm不在所选玻璃色散公式的有效范围内
  16. adb 下载文件到本地
  17. Android R系统Fingerprint指纹流程归纳
  18. java进阶之多线程二线程池
  19. android水印控件,Android图片添加文字水印并保存水印文字图片到指定文件
  20. 描述对未来计算机的畅想用英语作文,畅想未来人工智能的发展状况英语作文 关于畅想未来人工智能的发展状况的英语作文...

热门文章

  1. html ajax提交表单实例,Ajax提交表单并接收json实例代码
  2. MAC 下 安装redis 并配置 php redis 扩展
  3. 微信JS-SDK使用步骤(以微信扫一扫为例)
  4. js/jq判断鼠标滚轮方向
  5. 备忘录模式(Memento)
  6. 2015-12-08 English
  7. CoreLocation MKMapView
  8. [Enterprise Library]Configuration类设计分析
  9. Cesium入门11 - Interactivity - 交互性
  10. matplotlib嵌入到pyqt中