您的位置:首页 > 其它

ssh学习:hibernate中 HQL基本 查询

2016-02-16 11:44 519 查看
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

查看图片附件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: