求行尸走肉百度云资源第一季百度云资源!

本章介绍了Hibernate的几种主要检索方式:HQL检索方式、QBC检索方式、SQL检索方式。HQL是Hibernate& Query Language的缩写,是官方推荐的查询语言。QBC是Query By& Criteria的缩写,是Hibernate提供的一个查询接口。Hibernate是一个轻量级的框架,它允许使用原始SQL语句查询数据库。
6.1 HQL基础
HQL是Hiberante官方推荐的Hibernate检索方式,它使用类似SQL的查询语言,以面向对象的方式从数据库中查询。可以使用HQL查询具有继承、多态和关联关系的数据。在检索数据时应优先考虑使用HQL方式。
6.1.1 默认数据库表和数据
在讲解本章时,在没有特殊说明时,用到的数据库均为joblog,也就是在第4章建立的数据库。joblog中添加了3个表:学生表student、课程表course和选课表sc。
学生表student中各字段的结构如图6-1所示,字段的中文含义在Comment列中。
图6-1 学生表的数据结构
学生表student中的数据如图6-2所示,没有特殊说明时,用到的均为这6条记录。
此处仍然使用在第4章建立的HibernateProject项目,但是这里新建了一个包hibernate.ch06,这个包存放本章中的所有代码。在hibernate.ch06包中建立学生表对应的持久化类Student.java,代码如下。
图6-2 学生表中的数据
package hibernate.ch06;
public class Student {
&&&&&& private I&&&&&&&&&&&& //对象标识符
&&&&& private I&&&&&&&&&&& //学号
&&&&& private S&&&&&&&&& //姓名
&&&&& private S&&&&&&&&&&& //性别
&&&&& private S&&&&&&&&&& //所在系别
&&&&& private I&&&&&&&&&& //年龄
&&&&& private S&&&&&& //籍贯
&&&& && //省略了所有的get/set访问器
课程表course中的各个字段的结构如图6-3所示,字段的中文含义在Comment列中。
图6-3 课程表的结构
课程表中的数据如图6-4所示,如果没有特殊说明,用到的均为这4条记录。
图6-4 课程表的数据
在hibernate.ch06中新建持久化类Course.java类,代码如下。
package hibernate.ch06;
public class Course {
&&&&&& private I&&&&&&&&&&&& //对象标识符
&&&& private I&&&&&&&&&&& //课程号
&&&&&& private S&&&&&&&&&& //课程名
&&&&&& private Integer C&&&&&& //学分
&&&&&& && //省略了get/set访问器
选修表sc(sc为student-course的缩写)的结构如图6-5所示,字段的中文含义在Comment列中。
图6-5 选修表的结构
选修表中的数据如图6-6所示,没有特殊说明时,用到的均为这5条记录。
图6-6 选修表的数据
在hibernate.ch06中新建持久化类SC.java,SC.java的代码如下。
package hibernate.ch06;
public class SC implements java.io.Serializable& {
&&&&&& private I&&&&&&&&&&&& //id
&&&&&& private I&&&&&&&&&& //学号
&&&&&& private I&&&&&&&&&& //课程号
&&&&&& private I&&&&&&&& //成绩
&&&& public SC() {
&&&&& && //省略get/set访问器
后面的章节中将用这3个表和3个持久化类进行讲解。
6.1.2 检索类的所有对象
使用HQL语句可以检索出一个类的所有对象,如HQL语句&from& Student&表示检索Student类的所有对象。下面的程序检索学生类的所有对象。
&&&&&&& Query query=session.createQuery("from& Student"); //创建Query对象
&&&&&&& List& list=query.list();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //执行查询
&&&&&&& //以下代码做显示用,以后不再写出来
&&&&&&& Iterator it=list.iterator();
&&&&&&& while(it.hasNext()){
&&&&&&&&&&&&&&& Student stu=(Student)it.next();
&&&&&&&&&&&&&&&& System.out.println("id"+stu.getId());
&&&&&&&&&&&&&&&& System.out.println("name"+stu.getSname());
&&&&&&&&&&&&&&& System.out.println("/n");
&& & session.createQuery()以HQL查询语句为参数,生成一个查询对象。本例中的HQL语句为&from& Student&,这是from子句,格式如下。
其中,类名可以为类的全限定名,如:
from hibernate.ch06.Student
Hibernate使用自动引入功能(auto& import),会自动寻找需要的类,所以不推荐使用类的全限定名。注意,类名区分大小写,如果写成from student,将会抛出以下异常。
java.lang.NoClassDefFoundError:& hibernate/ch06/student (wrong name: hibernate/ch06/Student)
&&&&& HQL关键字不区分大小写,FROM、from和From是一样的。
调用query.list()时,真正开始执行HQL查询语句,并把查询的结果放在List中。
本例中查询的是Student类中的所有属性,如果查询Student类中的某一个或某几个属性,如查询所有学生的姓名和所在系,需要用到属性查询。
6.1.3 检索类的某几个属性
与SQL语句类似,HQL语句可以检索类的某一个或者某几个属性。以下代码查询所有学生的姓名和所在系。
&&&&&&& //创建Query对象
&& & && Query& query=session.createQuery("select Student.sname,Student.sdept from& Student");
&&&&&&& List list=query.list();&&&&&
//执行查询
&&&&&&& //以下代码显示查询的信息
&&&&&&& Iterator it=list.iterator();
&&&&&&& while(it.hasNext()){
&&&&&& &&&&&&&& Object[]& stu=(Object[])it.next();
&&&&&&&&&&&&&&& System.out.println("id"+stu[0]);
&&&&&&&&&&&&&&&& System.out.println("name"+stu[1]);
&&&&&&&&&&&&&&& System.out.println("/n");
&&& 属性查询使用select关键字,属性查询的格式如下。
select 属性1,属性2,& from 类名
&&&& 属性前可以加上类名加以限定,如:
select 属性1,属性2,& from 类名
但一般没有必要。
属性查询区分大小写,上面的代码中如果写成:
select SNAME,Sdept from Student
将抛出异常,提示找不到属性SNAME和属性Sdept。
&&&& 查询结果将只显示查询的属性列。
&& 属性查询的结果,对于用it.next()获得的每条记录,可以存储在Object[]数组中,以便进行存取。
6.1.4 指定别名
在查询时,可以用关键字as指定查询的别名,指定别名可以简化查询,有时必需指定别名才能进行查询。以下代码查询学号中含有4的学生的姓名和所在系。
select s.sname,s.sdept from Student as s where s.sno like '%4%'from Student s
s就是类Student的别名。注意as可以省略,即下面的查询语句和上面的语句是等效的。
select s.sname,s.sdept from Student s where s.sno& like '%4%'from Student s
6.1.5& where条件子句
where条件子句跟SQL中的where条件子句类似,它检索符合条件的对象。例如,查询所有所在系别为计算机系的学生:
select s.sname,s.sdept from Student s where& s.dept=&计算机&
&&&& where子句指定查询的条件,其语法和SQL类似。
&&&& 在where子句中可以指定比较运算符:&、&=、&、&=、&&,其含义分别为大于、大于等于、小于、小于等于、不等于。
查询年龄在22到23岁的学生:
from Student s where s.sage&=22 and& s.sage&=23
&&&& 在where子句中指定查询的属性是否为null:is null、is not null,其含义分别表示为空和不为空。
查询所在籍贯为空的学生:
from Student s where s.saddress is null
6.1.6 使用distinct过滤掉重复值
使用distinct关键字将去掉结果中的重复值,只检索符合条件的对象。如下面的例子检索学生实例中的不重复的年龄。
&&&&&&& Session& session=HibernateSessionFactory.currentSession();&&&&&&&&&&& //创建Session
&&&&&&& String hql="select distinct s.sage from& Student s";&&&&&&&&&&&&&&&&&& //HQL查询语句
&&&&&&& Query& query=session.createQuery(hql);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //创建查询
&&&&&&& List& list=query.list();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //执行查询
检索的结果如下,可见结果中去掉了一个重复的22岁。
阅读(...) 评论() &本帖子已过去太久远了,不再提供回复功能。hibernate的hql语句: 格式化日期的函数,把年份去掉 - ITeye问答
如题,因为我想查询人员的生日(以便提醒),不需要年份
问题补充:zouruixin 写道可以把日期变成calendar格式然后用calendar自带方法去掉年份
也可以使用to_char(xx,'MM-dd')
calendar是java类吧,可是我要的hql语句里的,还有to_char是oracle的函数,并不是hql。用不了
问题补充:我想能够hql带的函数最好,如果没有,那就用sqlserver的函数吧,可是我也找不到sqlserver有类似oracle的to_char这样的函数,convert这个行数,好像不能去年份
问题补充:解决问题了!~sql里有这些函数:year(time),month(time),day(time)这些函数的,分别取出年月日,再进行比较查询就行了~ 目前这个办法解决了问题,但还是盼望有更好的办法
问题补充:zouruixin 写道那就查出来带年的日期以后再进行simpledateformat 格式化?
问题已经解决~谢谢回答~
那就查出来带年的日期以后再进行simpledateformat 格式化?
可以把日期变成calendar格式然后用calendar自带方法去掉年份
也可以使用to_char(xx,'MM-dd')
已解决问题
未解决问题Hibernate中使用Hql查询出一定时间段的记录【 Date 比较】_Java_ThinkSAAS
Hibernate中使用Hql查询出一定时间段的记录【 Date 比较】
Hibernate中使用Hql查询出一定时间段的记录【 Date 比较】
内容来源: 网络
PHP开发框架
开发工具/编程工具
服务器环境
ThinkSAAS商业授权:
ThinkSAAS为用户提供有偿个性定制开发服务
ThinkSAAS将为商业授权用户提供二次开发指导和技术支持
让ThinkSAAS更好,把建议拿来。
开发客服微信Hibernate中HQL语句的使用 - 博客频道 - CSDN.NET
分类:hibernate
本文主要使用一些测试方法来讲解HQL的具体应用
采用一对多的关系映射举例,两个类Dept{did,dname,emps},Emp{dept,eid,ename}
Dept.hbm.xml中
&hibernate-mapping package=&com.tarena.demo.po&&
&class name=&Dept& table=&t_dept&&
&id name=&did& column=&did&&
&generator class=&identity&&&/generator&
&property name=&dname&&&/property&
&set name=&emps& cascade=&all& inverse=&true&&
&key column=&did&&&/key&
&one-to-many class=&Emp&/&
&/hibernate-mapping&
Emp.hbm.xml中
&hibernate-mapping package=&com.tarena.demo.po&&
&class name=&Emp& table=&t_emp&&
&id name=&eid& column=&eid&&
&generator class=&identity&&&/generator&
&property name=&ename&&&/property&
&many-to-one name=&dept& column=&did& class=&Dept&&&/many-to-one&
&query name=&findEmpByEid&&
from Emp where eid&?
&/hibernate-mapping&
public class TestHQL {
* Hibernate生成关系模型
public void test00DDL(){
Configuration cfg = new Configuration().configure();
SchemaExport export = new SchemaExport(cfg);
export.create(true, true);
public void test01InitData(){
//10个部门,30个员工
Session session = HibernateUtils.getSession();
for(int i=1;i&=10;i++){
Dept dept = new Dept();
dept.setDname(&部门&+i);
Set&Emp& emps = new HashSet&Emp&();
for(int j=1;j&=8;j++){
Emp emp = new Emp();
emp.setEname(&员工_&+i+&_&+j);
emp.setDept(dept);
emps.add(emp);
dept.setEmps(emps);
session.save(dept);
session.clear();
session.beginTransaction().commit();
HibernateUtils.close(session);
* 查询属性
* 查询一个属性,集合中的数据类型为String(对于dname属性),
* 如果对于did属性,则是Integer类型
public void test02(){
Session session = HibernateUtils.getSession();
String hql = &select dname from Dept&;
Query query = session.createQuery(hql);
List&String& dnames = query.list();
for (String dname : dnames) {
System.out.println(dname);
HibernateUtils.close(session);
* 查询多个属性,集合中数据的类型为Object[]
public void test03(){
Session session = HibernateUtils.getSession();
String hql = &select did,dname from Dept&;
Query query = session.createQuery(hql);
List&Object[]& dnames = query.list();
for (Object[] o : dnames) {
System.out.println(o[0]+&:&+o[1]);
HibernateUtils.close(session);
* 查询多个属性,动态构建一个对象,Dept类必须要有new Dept(dname,did)构造器
* 和无参构造器
public void test04(){
Session session = HibernateUtils.getSession();
String hql = &select new Dept(did,dname) from Dept&;
Query query = session.createQuery(hql);
List&Dept& depts = query.list();
for(Dept dept:depts){
System.out.println(dept.getDname());
HibernateUtils.close(session);
* 简单对象查询
* foreach迭代,如果迭代一个空值,如果从该对象获得方法,不会出现空指针异常
* 内部采用的是iterator,当it.hasNext()才进行。而如果是空值,it.hasNext()为false
* 不会执行该对象的方法,因此不会出现空指针异常。
public void test05(){
Session session = HibernateUtils.getSession();
String hql = &select d from Dept d&;
Query query = session.createQuery(hql);
List&Dept& depts = query.list();
for(Dept dept:depts){
System.out.println(dept.getDname()+&,&+dept.getDid());
HibernateUtils.close(session);
* 对象查询,条件查询
* 参数的顺序从0开始
public void test06(){
Session session = HibernateUtils.getSession();
String hql = &select d from Dept d where dname=?&;
Query query = session.createQuery(hql);
query.setString(0, &部门1&);
List&Dept& depts = query.list();
for (Dept dept : depts) {
System.out.println(dept.getDname());
HibernateUtils.close(session);
* 对象查询,条件查询
public void test07(){
Session session = HibernateUtils.getSession();
String hql = &select d from Dept d where dname=? and did=?&;
List&Dept& depts = session.createQuery(hql).
setString(0, &部门1&).setInteger(1, 1).list();
for (Dept dept : depts) {
System.out.println(dept.getDname());
HibernateUtils.close(session);
* 查询所有员工信息
* 分页查询
* setFirstResult();确定查询的起点
* setMaxResult();确定查询的条数
public void test08(){
Session session = HibernateUtils.getSession();
String hql = &from Emp&;
int currentPage = 5;
int pageSize = 5;
List&Emp& emps = session.createQuery(hql).
setFirstResult((currentPage-1)*pageSize).
setMaxResults(pageSize).list();
for (Emp emp : emps) {
System.out.println(emp.getEname());
HibernateUtils.close(session);
* 查询所有员工信息
* 查询最大页数
* 首先查询所有记录数
public void test09(){
Session session = HibernateUtils.getSession();
String hql = &select count(*) from Emp&;
List&Long& list = session.createQuery(hql).list();
int rec = list.get(0).intValue();
int pageSize = 7;
System.out.println(&最大页数为:&);
System.out.println(rec%pageSize == 0?rec/pageSize:rec/pageSize+1);
HibernateUtils.close(session);
* 使用命名查询
* 将hql语句写在映射文件中
* 查询ID号小于20的员工信息
* from Emp where eid&20
&query name=&findEmpByEid&&
from Emp where eid&?
getNamedQuery(),获取Query对象
public void test10(){
Session session = HibernateUtils.getSession();
Query query = session.getNamedQuery(&findEmpByEid&);
query.setInteger(0, 20);
List&Emp& emps = query.list();
for (Emp emp : emps) {
System.out.println(emp.getEid()+&:&+emp.getEname());
HibernateUtils.close(session);
* 在hibernate 中使用sql查询
* select * from t_
public void test11(){
Session session = HibernateUtils.getSession();
String sql = &select * from t_emp&;
SQLQuery query = session.createSQLQuery(sql);
List&Object[]& list = query.list();
for (Object[] o : list) {
System.out.println(o[0]+&:&+o[1]+&:&+o[2]);
HibernateUtils.close(session);
排名:千里之外
(3)(3)(5)(1)(0)(3)(3)(7)(9)(7)(2)(7)(1)(6)}

我要回帖

更多关于 行尸走肉8百度云资源 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信