Hibernate各种查询操作(一)

测试数据库如下:

t_sort表:                                   t_good表:

一、对象导航方式查询

查询所有食品类下面的食品

代码:

  1. //对象导航查询
  2. @Test
  3.  
  4. public void Test1(){
  5. SessionFactory sessionFactory = null;
  6. Session session = null;
  7. Transaction tx = null;
  8. try {
  9. sessionFactory = HibernateUtils.getFactory();
  10. session = sessionFactory.openSession();
  11. tx = session.beginTransaction();
  12. //1、使用get方法查询出食品类
  13. Sort food = session.get(Sort.class, 1);
  14. //2、使用sort对象的方法得到所有食品类中的食品
  15. Set<Good> set = food.getSetGoods();
  16. //3、遍历set集合
  17. for (Good good : set) {
  18. System.out.println(good);
  19. }
  20. tx.commit();
  21. } catch (Exception e) {
  22. tx.rollback();
  23. }finally{
  24. session.close();
  25. sessionFactory.close();
  26. }
  27. }

查询结果:

二、OID查询

OID查询就是根据id查询某一条记录

代码:

  1. //OID查询方式
  2. @Test
  3.  
  4. public void Test2(){
  5. SessionFactory sessionFactory = null;
  6. Session session = null;
  7. Transaction tx = null;
  8. try {
  9. sessionFactory = HibernateUtils.getFactory();
  10. session = sessionFactory.openSession();
  11. tx = session.beginTransaction();
  12. //OID查询就是使用get方法查询出一条记录
  13. Sort food = session.get(Sort.class, 1);
  14. System.out.println(food);
  15. tx.commit();
  16. } catch (Exception e) {
  17. tx.rollback();
  18. }finally{
  19. session.close();
  20. sessionFactory.close();
  21. }
  22. }

结果

    

三、HQL查询

hql查询是使用Hibernate Query Language进行的一种查询方式,在这种查询方式中必须要写hql语句才能查询。

1、查询所有

查询所有的hql语句格式为:from 实体类名称(以查询所有商品为例)

代码:

  1. // HQL查询所有。查询所有商品为例
  2. @Test
  3. public void Test3() {
  4. SessionFactory sessionFactory = null;
  5. Session session = null;
  6. Transaction tx = null;
  7. try {
  8. sessionFactory = HibernateUtils.getFactory();
  9. session = sessionFactory.openSession();
  10. tx = session.beginTransaction();
  11. // 1、得到Query对象,并写入hql语句
  12. Query query = session.createQuery("from Good");
  13. //2、使用Query对象的list方法得到数据集合
  14. List<Good> list = query.list();
  15. //3、遍历集合获取数据
  16. for (Good good : list) {
  17. System.out.println(good);
  18. }
  19. tx.commit();
  20. } catch (Exception e) {
  21. tx.rollback();
  22. } finally {
  23. session.close();
  24. sessionFactory.close();
  25. }
  26. }

测试结果:

  

2、条件查询

条件查询有准确查询和模糊查询,使用hql语句完成。

(1)准确查询hql语句:from 实体类名 where 实体属性名 = ? and 实体类属性名 = ?。

准确查询代码: 

  1. // HQL准确条件查询。查询名字为面包,描述为奶油面包的记录
  2. @Test
  3. public void Test4() {
  4. SessionFactory sessionFactory = null;
  5. Session session = null;
  6. Transaction tx = null;
  7. try {
  8. sessionFactory = HibernateUtils.getFactory();
  9. session = sessionFactory.openSession();
  10. tx = session.beginTransaction();
  11. // 1、得到Query对象,并写入hql语句
  12. Query query = session.createQuery("from Good where gname = ? and gmono =?");
  13. //2、填写上一步中占位符的内容
  14. query.setParameter(0, "面包");
  15. query.setParameter(1, "奶油面包");
  16. //3、使用Query对象的list方法得到数据集合
  17. List<Good> list = query.list();
  18. //3、遍历集合获取数据
  19. for (Good good : list) {
  20. System.out.println(good);
  21. }
  22. tx.commit();
  23. } catch (Exception e) {
  24. tx.rollback();
  25. } finally {
  26. session.close();
  27. sessionFactory.close();
  28. }
  29. }

查询结果:

    

提示: 查询语法还有以下方式:(仅供参考)

(2)模糊查询hql语句:from 实体类名 where 实体类属性名 like  ?。

模糊查询代码:

  1. // HQL模糊条件查询。查询名字中有"手"字的记录
  2. @Test
  3. public void Test5() {
  4. SessionFactory sessionFactory = null;
  5. Session session = null;
  6. Transaction tx = null;
  7. try {
  8. sessionFactory = HibernateUtils.getFactory();
  9. session = sessionFactory.openSession();
  10. tx = session.beginTransaction();
  11. // 1、得到Query对象,并写入hql语句
  12. Query query = session.createQuery("from Good where gname like ?");
  13. // 2、填写上一步中占位符的内容
  14. query.setParameter(0, "%手%");
  15. // 3、使用Query对象的list方法得到数据集合
  16. List<Good> list = query.list();
  17. // 3、遍历集合获取数据
  18. for (Good good : list) {
  19. System.out.println(good);
  20. }
  21. tx.commit();
  22. } catch (Exception e) {
  23. tx.rollback();
  24. } finally {
  25. session.close();
  26. sessionFactory.close();
  27. }
  28. }

模糊查询结果:

3、排序查询

排序查询hql语句:正序: form 实体类名称 order by 实体类属性名 asc

         倒序:from 实体类名称 order by 实体类属性名 desc

(1)正序查询代码 

  1. // HQL排序条件查询。gid正序查询
  2. @Test
  3. public void Test6() {
  4. SessionFactory sessionFactory = null;
  5. Session session = null;
  6. Transaction tx = null;
  7. try {
  8. sessionFactory = HibernateUtils.getFactory();
  9. session = sessionFactory.openSession();
  10. tx = session.beginTransaction();
  11. // 1、得到Query对象,并写入hql语句
  12. Query query = session.createQuery("from Good order by gid asc");
  13. // 2、使用Query对象的list方法得到数据集合
  14. List<Good> list = query.list();
  15. // 3、遍历集合获取数据
  16. for (Good good : list) {
  17. System.out.println(good);
  18. }
  19. tx.commit();
  20. } catch (Exception e) {
  21. tx.rollback();
  22. } finally {
  23. session.close();
  24. sessionFactory.close();
  25. }
  26. }

  正序查询测试结果:

    

(2)倒序查询代码: 

  1. // HQL排序查询。gid倒序查询
  2. @Test
  3. public void Test7() {
  4. SessionFactory sessionFactory = null;
  5. Session session = null;
  6. Transaction tx = null;
  7. try {
  8. sessionFactory = HibernateUtils.getFactory();
  9. session = sessionFactory.openSession();
  10. tx = session.beginTransaction();
  11. // 1、得到Query对象,并写入hql语句
  12. Query query = session.createQuery("from Good order by gid desc");
  13. // 2、使用Query对象的list方法得到数据集合
  14. List<Good> list = query.list();
  15. // 3、遍历集合获取数据
  16. for (Good good : list) {
  17. System.out.println(good);
  18. }
  19. tx.commit();
  20. } catch (Exception e) {
  21. tx.rollback();
  22. } finally {
  23. session.close();
  24. sessionFactory.close();
  25. }
  26. }

倒序查询测试结果:

    

4、分页查询

在mysql数据库中分页使用limit实现,在Hibernate中使用Query对象的两个方法实现。

分页查询代码:   

  1. // HQL分页查询。每页3条数据查询
  2. @Test
  3. public void Test8() {
  4. SessionFactory sessionFactory = null;
  5. Session session = null;
  6. Transaction tx = null;
  7. try {
  8. sessionFactory = HibernateUtils.getFactory();
  9. session = sessionFactory.openSession();
  10. tx = session.beginTransaction();
  11. // 1、得到Query对象,并写入hql语句
  12. Query query = session.createQuery("from Good");
  13. //2、使用Query的方法实现分页
  14. //2.1设置第一个要查询的位置(计算公式:(当前页数-1)*每页的记录数)
  15. query.setFirstResult(0);
  16. //2.2设置每页显示的最大记录数
  17. query.setMaxResults(3);
  18. // 2、使用Query对象的list方法得到数据集合
  19. List<Good> list = query.list();
  20. // 3、遍历集合获取数据
  21. for (Good good : list) {
  22. System.out.println(good);
  23. }
  24. tx.commit();
  25. } catch (Exception e) {
  26. tx.rollback();
  27. } finally {
  28. session.close();
  29. sessionFactory.close();
  30. }
  31. }

测试结果:

  

5、投影查询

投影查询概念:查询的不是表中的所有字段,而是一部分字段

代码:

  1. // HQL投影查询。查询Good的name
  2. @Test
  3. public void Test9() {
  4. SessionFactory sessionFactory = null;
  5. Session session = null;
  6. Transaction tx = null;
  7. try {
  8. sessionFactory = HibernateUtils.getFactory();
  9. session = sessionFactory.openSession();
  10. tx = session.beginTransaction();
  11. // 1、得到Query对象,并写入hql语句
  12. Query query = session.createQuery("select gname from Good");
  13. //2、获取结果
  14. List<Object> list =query.list();
  15.  
  16. for (Object object : list) {
  17. System.out.println(object);
  18. }
  19. tx.commit();
  20. } catch (Exception e) {
  21. tx.rollback();
  22. } finally {
  23. session.close();
  24. sessionFactory.close();
  25. }
  26. }

测试结果:

    

6、聚集函数查询

常用聚集函数:count  avg  max  min  sum

以count为例进行说明

hql语句:select count(*) from 实体类名称

代码:

  1. // HQL投影查询。查询Good的name
  2. @Test
  3. public void Test10() {
  4. SessionFactory sessionFactory = null;
  5. Session session = null;
  6. Transaction tx = null;
  7. try {
  8. sessionFactory = HibernateUtils.getFactory();
  9. session = sessionFactory.openSession();
  10. tx = session.beginTransaction();
  11. // 1、得到Query对象,并写入hql语句
  12. Query query = session.createQuery("select count(*) from Good");
  13. //2、获取结果(结果为long类型)
  14. Object obj = query.uniqueResult();
  15. //3、转化为long(类型为long,转为int会报错)
  16. Long long1 = (Long) obj;
  17. int count = long1.intValue();
  18. System.out.println(count);
  19. tx.commit();
  20. } catch (Exception e) {
  21. tx.rollback();
  22. } finally {
  23. session.close();
  24. sessionFactory.close();
  25. }
  26. }

测试结果:

    

分享知识-快乐自己:Hibernate各种查询操作的更多相关文章

  1. Hibernate各种查询操作(一)

    测试数据库如下 t_sort表:                                   t_good表: 一.对象导航方式查询 查询所有食品类下面的食品 代码: //对象导航查询 @Te ...

  2. 分享知识-快乐自己:java代码 操作 solr

    POM 文件: <!-- solr客户端 --> <dependency> <groupId>org.apache.solr</groupId> < ...

  3. Hibernate各种查询操作(二)

    一.QBC的查询方式 使用QBC不在需要写hql语句,而是使用criteria对象的各种方法来实现. 1.查询所有 //使用QBC方式查询所有 @Test public void test11(){ ...

  4. Hibernate【查询、连接池、逆向工程】

    前言 在Hibernate的第二篇中只是简单地说了Hibernate的几种查询方式....到目前为止,我们都是使用一些简单的主键查询阿...使用HQL查询所有的数据....本博文主要讲解Hiberna ...

  5. 分享知识-快乐自己:Caused by: org.hibernate.tool.schema.extract.spi.SchemaExtractionException: More than one table found in namespace (, ) : Dept (XXX)

    在命名空间(,)中找到多个表 - SchemaExtractionException? 问题: 尝试在Java应用程序中使用Hibernate将一些值保存到表中时,我一直面临着这个奇怪的异常. 但是, ...

  6. 分享知识-快乐自己:Hibernate 中 get() 和 load()、sava、update、savaOrUpdate、merge,不同之处及执行原理?

    1):Hibernate 中 get()  和 load() 有什么不同之处? 1)Hibernate的 get方法,会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在缓存中查 ...

  7. 分享知识-快乐自己:Hibernate 关联映射

    关联关系映射--概念: 关联关系是使用最多的一种关系,非常重要.在内存中反映为实体关系,映射到DB中为主外键关系. 实体间的关联,即对外键的维护.关联关系的发生,即对外键数据的改变. 外键:外面的主键 ...

  8. 分享知识-快乐自己:搭建第一个 Hibernate (Demo)

    使用 Hibernate 完成持久化操作 七大 步骤: 1.读取并解析配置文件及映射文件: Configuration configuration=new Configuration().config ...

  9. 分享知识-快乐自己:初识 Hibernate 概念片(一)

    1):什么是 Hibernate? Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibe ...

随机推荐

  1. IOS Audio开发集合

    打算每天抽出一点时间学习音频方面的知识,在此做下汇总: 1. 多媒体层预览  根据结构,明确学习内容.

  2. Linux视频培训教程

    很详尽的Linux培训教程,既包含日常工作常常要用到的实践及技巧,又包含Linux认证及系统管理及架构,讲的很不错.最关键的.这么具体,完整的教程还是免费的.花了点时间拿它整理了下. 第一部分: Li ...

  3. oracle 使用job定时自动重置sequence

    一.赋予用户创建和删除sequence的权限 grant create any sequence to user_name; grant drop any sequnce to user_name; ...

  4. RF ---library

    RF内置库: http://robotframework.org/robotframework/ SSHLibrary:   ---WEB自动化测试 http://robotframework.org ...

  5. HDU - 3874 Necklace (线段树 + 离线处理)

    欢迎參加--每周六晚的BestCoder(有米! ) Necklace Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65536/3 ...

  6. 织梦在广告(myad)中使用css样式

    使用单引号,以及只有style这一个属性

  7. VESA-ADV7123-SOCKIT-DE2115

    /*--VGA Timing--Horizontal :-- ______________ _____________-- | | |--_______________| VIDEO |_______ ...

  8. caffe--anaconda2--makefile.config--compile --ubuntu16.04

    sea@sea-X550JK:/media/sea/wsWin10/wsUbuntu16.04/DlFrames/caffe$ cat Makefile.config: ## Refer to htt ...

  9. Centos 7 远程桌面客户端

    在centos下面要远程连接windows,有人说用rdesktop,但是好像centos 7没有,对从源代码编译也不大感兴趣. 幸好还有人提醒, https://geekblood.com/2014 ...

  10. MongoDB--安装部署

    MongoDB安装 说明: 本次安装教程: 版本:mongoDB-3.2.4 安装环境:windows 10 ,64位操作系统 准备:安装包.Robomongo(客户端用于查看mongoDB里面的数据 ...