`
gaosililn
  • 浏览: 70005 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

ssh学习:hibernate中 HQL基本 查询

 
阅读更多

hibernate的基本查询

在Hibernate中常用的查询方式会有三种:hql,标准化条件查询,原生派sql

HQL基本查询

HQL:Hibernate uses a powerful query language .  Hibernate uses a powerful query language (HQL) that is similar in appearance to SQL. Compared with SQL, however, HQL is fully object-oriented and understands notions like inheritance, polymorphism and association.(Hibernate使用一个强大的查询语言( HQL ),它在外观上的SQL相似。与SQL相比,但是, HQL是完全面向对象的理解如继承,多态和关联。)

HQL的功能:

条件查询,投影查询,分页查询,分组查询,动态绑定参数查询,内置了函数查询,连接查询,

  • Hibernate的基本查询

       Query接口是Hibernate中专门HQL查询的接口,query接口获取及使用方式

//默认加载hibernate.cfg.xml文件并获取Configuration的数据对象
			Configuration configuration = new Configuration().configure();
			//获取服务对象
			StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
					.applySettings(configuration.getProperties());
			ServiceRegistry build = builder.build();
			//获取SessionFactory从而获取session对象
			SessionFactory sessionFactory = configuration.buildSessionFactory(build);
			//获取session对象
			session = sessionFactory.openSession();
			//打开事务
			transaction = session.beginTransaction();
                        //获取query对象
                        Query query = session.createQuery(hql);
                        // 从query对象中获取数据的集合队列
			 List list = query.list();
//亦可以使用下面的方法代替query.list()方法获取数据对象,但是呢,使用query.list()的方法只执 //行与数据库的一次交互从而获取全部的数据对象的集合对象,而query.iterate()是存在多个返回的数//据对象时候,每一个对象都会执行一次与数据库的交互sql.提倡使用list方法,减少数据库的交互
                         //Iterator students = query.iterate();

 

    
查询实体对象的全部数据

 

//hql from
from 表名;(表名为数据持久化对象类的命名名字,必须一致,可以写全路径也可不写全路径,默认会查找全路径 )

 

   实例:

// hql语句 数据库的表名严格按照数据持久化的命名,可以写全路径,但默认会查找全路径的持久化对象 
			String hql = "from Student";
			// 获取hibernate的转门用于查询的接口query
			Query query = session.createQuery(hql);
			// 获取数据对象的实例,查询的数据自动封装到实体对象当中
			// 在实际的开发当中建议使用query.list()的方法提取数据的全部数据对象实例集合只执行一句sql与数据库进行交互
			List<Student> students = (List<Student>) query.list();
			for (Student stu : students) {
				System.out.println(stu);
			}
			// 在从数据库中提取数据实例时候,若存在多个实例对象,
			// query.iterate()方法会每提取一个数据对象实例时候会执行一次sql与数据库进行交互
			// Iterator students = query.iterate();
			// while (students.hasNext()) {
			// System.out.println(students.next());
			// }
			transaction.commit();

 hql语句也可以换成下面的而形式:使用别名查询

 

 String hql = "select stu from Student As stu ";

 投影查询:即查询数据对象的部分属性/字段

方式一:select 属性1,属性2, from 表名  

这样的投影查询是将查询到的数据对象元素保存在对象数据当中,在将数组保存在一个队列当中。

实例:

 // 投影查询
			String hql = "select stu.age ,stu.name from Student As stu";
			Query query = session.createQuery(hql);
			// 一个对象查询到的属性封装在一个数组当中,按照查询的顺序存放
			// 再将每个对象组成的数组保存在队列当中
			List<Object[]> students = query.list();
			for (Object[] student : students) {
				for (Object obj : student) {
					System.out.println(obj);
				}
				System.out.println("+++++++++");
			}

 方式2:实例化投影查询:select new Student(属性1,属性2) from Student

这样的投影查询是将查询的数据元素通过 new 构造方法进行封装到数据对象当中,持久化的类中必须要有相对应的构造方法。这样会比上一种投影查询会好很多!这样是查询到的字段通过构造方法封装到一个对象实例当中,再将一个对象保存到队列中去

实例:

// 实例化投影查询
			//查询的字段/元素通过相对应的构造方法封装到一个对象 实例当中
			// 必须实现查询字段的构造方法
			String hql = "select new Student(name,age) from Student";
			//获取session对象
			Query query = session.createQuery(hql);
			//将查询得到的数据对象保存在list队列集合当中
			List<Student> students = query.list();
			for (Student student : students) {
				System.out.println(student);
			}

 where 条件查询:

在hql中的where条件查询也可以像sql中一样,使用各种逻辑判定符、比较运算符、范围运算符、模式运算符等。在官方文档中提供的说明:

 实例:

// 条件查询
			// String hql = "select new Student(name,age) from Student where name like 'jing'";
			String hql = "from Student As stu where stu.name like 'jing' ";
			Query query = session.createQuery(hql);
			// 必须实现查询字段的构造方法
			List<Student> students = query.list();
			for (Student student : students) {
				System.out.println(student);
			}

 

使用函数库查询:

HQL的附带着强大的函数库:字符串相关,数字相关,集合相关,时间和日期相关



 实例:

//将名字全部转为大写
 String hql = "select new Student(uper(name),age) from Student where name like 'jing'";
			Query query = session.createQuery(hql);
			// 必须实现查询字段的构造方法
			List<Student> students = query.list();
			for (Student student : students) {
				System.out.println(student);
			}

 占位符查询:

方式1:参数位置绑定,使用问号‘’ 占位  where 字段1=? 字段2=? ;

实例:

 

// 参数位置占位符
			// 使用问号占位 通过query.set...方法设置相对应的数值,前一参数为第几个问号(0开始)
			String hql = "from Student stu where stu.age=? or stu.name=?";
			Query query = session.createQuery(hql);
			//第一个问号设置参数int为22问号个数从0开始)
			query.setInteger(0, 22);
			//第二个问号设置参数String 为‘gaosi’
			query.setString(1, "gaosi");
			List<Student> students = (List<Student>) query.list();
			for (Student student : students) {
				System.out.println(student);
			}

 

方式2:参数名字绑定,使用符占位‘:代表符’   。where 字段1=:代表符号1 and 字段2=:代表符号2 ;

实例:

// 占位符
			// 使用参数名字占位符 :代表字符
			String hql = "from Student where name=:name or age=:age";
			Query query = session.createQuery(hql);
			// 向使用age代表的字符赋值22
			query.setInteger("age", 22);
			// 向使用name代表的字符赋值为gaosi
			query.setString("name", "gaosi");
			List<Student> students = query.list();
			for (Student student : students) {
				System.out.println(student);
			}

 distinct查询

 

String hql = "select distinct age from Student";
			Query query = session.createQuery(hql);
			List<Student> students = query.list();
			System.out.println(students);

 order by查询:对查询的记录进行排序 order  by ... desc /asc. 默认为ASC 升序

实例:

 

//排序 降序
			String hql = "select age from Student order by age desc";
			Query query = session.createQuery(hql);
			List list = query.list();

 

  • Hibernate的聚合函数和分组查询

在hql中的聚合函数一般有:

 示例:

// avg函数 求平均值
			String hql = "select avg(stu.age) from Student stu";
			Query query = session.createQuery(hql);
			// 将求得的平均值保存在list中,类型为long型
			List list = query.list();
			System.out.println(list.get(0));
 分组查询: group  by

 

分组过滤查询:having 。经常与group by 搭配使用

实例代码:

 

//统计按年龄分组且平均年龄大于22的人数
			 String hql = "select count(stu.age) from Student stu "
			 		+ "group by stu.age having avg(stu.age)>22";
			 Query query = session.createQuery(hql);
			 List list = query.list();
			 System.out.println(list);
 

 

  • Hibernate的分页查询和批量更新

分页查询:通过query..setFirstResult(bin)设置查询的起始位置,query..setMaxResults(max);设置查询的每页的最大记录条数。实现分页查询

实例代码;

// 分页查询
			 String hql = "select new Student(stu.name,stu.age)"
			 		+ " from Student stu";
			 Query query =	 session.createQuery(hql)
					 //设置查询的起始位置
					 .setFirstResult(3)
					 //设置查询的每页的最大记录条数
					 .setMaxResults(3);
			 List<Student> students = query.list();
			 for (Student student : students) {
			 System.out.println(student);
			
			 }
 批量更新:(批量删除或修改)

 

 

 int i = query.executeUpdate();// 用于批量处理数据
//当返回的值大于0则是批量处理成功
 实例代码:

 

 

                        String hql = "delete from Student where name=:name";// 批量删除
			// 批量修改
			Query query = session.createQuery(hql);
			// List list = query.list();
			query.setString("name", "zhangsan");
			int i = query.executeUpdate();// 用于批量处理数据
			if (i > 0) {
				System.out.println("成功");
			} else {
				System.out.println("失败");
			}
 
  • Hibernate的命名查询

 在Xxx.hbm.xml文件当中编写hql/sql来实现命名查询  。

编写格式:

<query name="name" >
<![CDATA[   HQL/SQL语句    ]]>
</query>

 示例代码 Xxx.hbm.xml文件编写代码:

<!-- 命名查询 -->
	<query name="selectStudents">
	<![CDATA[from Student]]>
	</query>

 

//命名查询
                       Query query = session.getNamedQuery("selectStudents");
			List students = query.list();
			System.out.println(students);

 

 

 

更为官方的文档说明以及例子:sql官方文档

 

  • 大小: 53.8 KB
  • 大小: 88.8 KB
  • 大小: 95.2 KB
分享到:
评论

相关推荐

    hibernatehql

    SSH+dwr实现三级级联 hibernate,hql描述语法

    hibernate的hql语句

    让你更好的理解SSH开发的运营。更好的调用数据

    Hibernate教程PPT

    Hibernate教程PPT;Hibernate教程 SSH ORM 对象-关系映射 HQL查询;Hibernate教程 SSH ORM 对象-关系映射 HQL查询

    SSH,struts2+hibernate+spring+mysql增删改查经典案例

    最近新来公司,做的一个间的增删改查案例,相信对于想学习SSH,struts2+hibernate+spring三大框架java来说是个很好的案例哦。

    SSh sql/hql 分页

    SSH 分页的例子源代码 全~~ 代码很全面了适合新手借鉴。但不支持完全的抄袭自己写还是最快的学习办法。

    Hibernate常用API

    ConfigurationConfiguration类类 SessionFactorySessionFactory接口接口 SessionSession接口接口 TransactionTransaction接口接口 ...使用使用HiberntaeHiberntae的的HQLHQL语言进行数据库访问语言进行数据库访问

    基于Jsp的在线考试系统毕业设计论文

    使用ssh必然用到了hql查询,虽然学习过hibernate高级查询,而用hibernate联合4,5张表进行查询时就不知道该用hibernate的那种方式进行查询了,一开始觉得hibernate远没有jdbc直接连数据库简单,后来随着使用hql...

    Java的Hibernate框架中用于操作数据库的HQL语句讲解

    主要介绍了Java的Hibernate框架中用于操作数据库的HQL语句讲解,Hibernate是Java的SSH三大web开发框架之一,需要的朋友可以参考下

    SSH框架示例(可以直接用)

    ****比较适合新手理解SSH框架***...hibernate负责ORM,hql操作对象。 spring负责使用JDBC操作数据库。都写了一个小例子。 搭这个框架的初衷主要是想自己配置一下spring整合proxool以及aop思想对service层的事物控制等。

    SSH 框架所需JAR包

    2.antlr-2.7.2.jar(语言转换工具,hibernate利用它实现HQL到SQL的转换) 3.commons-collections-3.2.1.jar(commons项目中的子项目,是对collection集合的封装) 4.dom4j-1.6.1.jar(对dom4j的封装,是解析xml文件...

    SSH 项目 整合jar包

    2.antlr-2.7.2.jar(语言转换工具,hibernate利用它实现HQL到SQL的转换) 3.commons-collections-3.2.1.jar(commons项目中的子项目,是对collection集合的封装) 4.dom4j-1.6.1.jar(对dom4j的封装,是解析xml文件...

    强大ssh分页实现

    好强大的ssh分页,封装的很好,适合初学者研究下,可以更快帮助初学者掌握分页机制,学起来不是很容易,但是当你学会了就豁然开朗,其他的分页直接可以藐视了,哈。。。我就是这样学过来的 有相关教程:...

    spring+struts2+hibernate整合实现分页

    用三大框架整合实现分页,附加可用,逻辑简单适合初学者

    java web技术开发大全(最全最新)

    Hibernate(会话、映射、标准查询API、HQL、事务管理、锁等)。除此之外,《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》还提供了两个完整的实例来讲解开发SSH的详细步骤和方法。通过对这两个...

    在Java的Hibernate框架中使用SQL语句的简单介绍

    主要介绍了在Java的Hibernate框架中使用SQL语句的方法,Hibernate是Java的SSH三大web开发框架之一,需要的朋友可以参考下

    java web开发技术大全

    Hibernate(会话、映射、标准查询API、HQL、事务管理、锁等)。除此之外,《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》还提供了两个完整的实例来讲解开发SSH的详细步骤和方法。通过对这两个...

    java web开发技术大全1 pdf

    《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》通过对SSH中的各种技术循序渐进地讲解,使读者尽快掌握开发基于SSH的Web程序的方法。《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+...

    java web开发技术大全2 z02 pdf

    《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》通过对SSH中的各种技术循序渐进地讲解,使读者尽快掌握开发基于SSH的Web程序的方法。《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+...

    java web开发技术大全4 z04 pdf

    《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》通过对SSH中的各种技术循序渐进地讲解,使读者尽快掌握开发基于SSH的Web程序的方法。《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+...

    Java Web开发技术大全5.z05 pdf

    《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》通过对SSH中的各种技术循序渐进地讲解,使读者尽快掌握开发基于SSH的Web程序的方法。《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+...

Global site tag (gtag.js) - Google Analytics