- 浏览: 364581 次
- 来自: 北京
文章分类
- 全部博客 (237)
- XML (6)
- JavaSE (39)
- Junit (1)
- Maven (10)
- JavaScript (12)
- JavaEE (16)
- HTML5 (10)
- java多线程 (8)
- Hibernate (30)
- Java反射 (3)
- Spring (11)
- Struts (1)
- svn (2)
- linux (12)
- 代码实例 (1)
- 设计模式 (1)
- UML (1)
- javassist (1)
- Oracle (3)
- Hibernate异常 (9)
- DWR (6)
- Java泛型 (2)
- SpringMVC (11)
- Dbunit (3)
- github (2)
- Algorithm (1)
- zTree (1)
- jquery (7)
- freemarker (4)
- mysql (5)
- ffmpeg (1)
- 编码 (1)
- lucene (15)
- hadoop (1)
- JVM (1)
- Regular Expressions (5)
- myeclipse (1)
- 爬虫 (7)
- 加密 (3)
- WebService (2)
- Socket (2)
- Windows (1)
最新评论
-
wxpsjm:
好直接
HV000030: No validator could be found for type: java.lang.Integer. -
wxhhbdx:
学习了,对新手来说很不错的教程。
SpringMVC入门 (二) 数值传递 -
xgcai:
正好在学dwr
DWR入门 (二)用户实例
三个实体类对象:
映射文件:
=======================================================
HQL查询
方法1. 获取Object[]
/**
* Return the query results as a <tt>List</tt>. If the query contains
* multiple results pre row, the results are returned in an instance
* of <tt>Object[]</tt>.
*
* @return the result list
* @throws HibernateException
*/
public List list() throws HibernateException;
list方法可以返回一个Object[]类型对象,比如我们查询"select s.name,s.age from Student s",就会得到一个Object[]对象,如下所示:
name age
xx xx
xx xx
这里的每一行都是一个Object数组。因此我们可以通过强制类型转换,将其转换为Object[]。在这里其中[0]就是name,[1]就是age。 代码如下:
方法2.获取实例对象查询
这种方式适用于当我们只需要部分值的时候。
上面的例子就通过包含部分元素(name,age)的Student的构造函数来获取Student实例。
这里只查询了age和name。 而其它元素都是空的。
注意: 这里必须在Student类中声明一个构造函数:
没有这个构造函数,就会抛出异常(could not locate appropriate constructor)
方法3. 通过inner join进行查询
什么是内连接(inner join)?
select * from team join student on team.id=student.team_id where team.id='team_a';
也就是查询出Student表中team id=team_a的。等价于:
select * from team,student where team.id=student.team_id ; team.id='team_a';
(瞎写的,这里我也不会写)
具体代码实例:
输出结果为:
drawer : alleni
drawer : eline
hunter : doudou
可以看出Hibernate将inner join查询到的内容通过HQL语句格式,分别放入查询表所映射的类对象实例中。
方法4.通过实例对象进行查询
方法5.通过条件过滤器进行查询
这里通过过滤器查询, 查询结果和方法4的一样。
public class Team { private String id; private String name; private Set students=new HashSet(); } public class Course { private String id; private String name; private Set<Student> students; } public class Student { private String id; private String cardId; private int age; private String name; private Set<Course> courses; }
映射文件:
[b]Team.hbm.xml[/b] <hibernate-mapping package="hql"> <class name="Team" table="team"> <id name="id" column="id" type="string"> <generator class="uuid"></generator> </id> <property name="name" column="teamName" type="string"/> <set name="students" inverse="true" fetch="select" lazy="true"> <key column="team_id"/> <one-to-many class="Student"/> </set> </class> </hibernate-mapping> [b]Course.hbm.xml[/b] <hibernate-mapping package="hql"> <class name="Course" table="course"> <id name="id" column="id" type="string"> <generator class="uuid"></generator> </id> <property name="name" column="course_Name" type="string"/> <set name="students" inverse="true" fetch="select" lazy="true"> <key column="course_id"/> <many-to-many class="Student" column="student_id"/> </set> </class> </hibernate-mapping> [b]Student.hbm.xml[/b] <hibernate-mapping package="hql"> <class name="Student" table="student"> <id name="id" column="id" type="string"> <generator class="uuid"></generator> </id> <property name="name" column="student_Name" type="string"/> <set name="courses" inverse="true" fetch="select" lazy="true"> <key column="student_id"/> <many-to-many class="Course" column="course_id"/> </set> <many-to-one name="team" fetch="select" column="team_id" class="Team"/> </class> </hibernate-mapping>
SQL插入语句: create table course ( id varchar2(32) default '' not null , course_name varchar2(45) default null, primary key (id) ); create table team( id varchar2(32) default '' not null, team_name varchar2(45), primary key(id) ); create table student( id varchar2(32) default '' not null, student_name varchar2(45) , student_age number(10) , student_cardid varchar2(15) , team_id varchar2(32) , primary key(id) ); create table student_course( student_id varchar2(32) not null, course_id varchar2(32) not null ); alter table student_course add constraint FK_dk062403lt7507oncwn9uo4ro foreign key (course_id) references course; alter table student_course add constraint FK_3shg469d7jsf2a81b5x62jlq1 foreign key (student_id) references student; alter table student add constraint FK_8eu2c4tg0i8amuwx6n6d4i8h0 foreign key (team_id) references team(id); insert into student values ('1','alleni',22,'111',null); insert into student values ('2','eline',23,'222',null); insert into student values ('3','doudou',8,'333',null); insert into course values('111','Chinese'); insert into course values('222','Math'); insert into course values('333','English'); insert into course values('444','Physical'); insert into course values('555','Chemistry'); insert into course values('666','Geography'); insert into team values('team_a','drawer'); insert into team values('team_b','hunter'); update student set team_id ='team_a' where id='1'; update student set team_id ='team_a' where id='2'; update student set team_id ='team_b' where id='3'; insert into student_course values ('1','333'); insert into student_course values ('1','666'); insert into student_course values ('2','222'); insert into student_course values ('2','333'); insert into student_course values ('2','444'); insert into student_course values ('2','555'); insert into student_course values ('3','111'); insert into student_course values ('3','444'); insert into student_course values ('3','555');
=======================================================
HQL查询
方法1. 获取Object[]
/**
* Return the query results as a <tt>List</tt>. If the query contains
* multiple results pre row, the results are returned in an instance
* of <tt>Object[]</tt>.
*
* @return the result list
* @throws HibernateException
*/
public List list() throws HibernateException;
list方法可以返回一个Object[]类型对象,比如我们查询"select s.name,s.age from Student s",就会得到一个Object[]对象,如下所示:
name age
xx xx
xx xx
这里的每一行都是一个Object数组。因此我们可以通过强制类型转换,将其转换为Object[]。在这里其中[0]就是name,[1]就是age。 代码如下:
Query query=session.createQuery("select s.name,s.age from Student s"); List list=query.list(); for(int i=0;i<list.size();i++){ Object[] obj=(Object[]) list.get(i); System.out.println(obj[0]+", "+obj[1]); //输出结果:alleni, 22 // eline, 23 // doudou, 8 }
方法2.获取实例对象查询
//这种方式将返回的离散的值作为一个Student类型对象传了回来。 Query query=session.createQuery("select new Student(s.name,s.age) from Student s"); List<Student> list=query.list(); for(Student s:list){ System.out.println(s.getAge()); //有值 System.out.println(s.getName()); //有值 System.out.println(s.getCardId()); //null }
这种方式适用于当我们只需要部分值的时候。
上面的例子就通过包含部分元素(name,age)的Student的构造函数来获取Student实例。
这里只查询了age和name。 而其它元素都是空的。
注意: 这里必须在Student类中声明一个构造函数:
//这里的参数顺序必须和HQL语句中的new Student(s.name,s.age)一致。 public Student(String name,int age ) { this.age = age; this.name = name; }
没有这个构造函数,就会抛出异常(could not locate appropriate constructor)
方法3. 通过inner join进行查询
什么是内连接(inner join)?
select * from team join student on team.id=student.team_id where team.id='team_a';
也就是查询出Student表中team id=team_a的。等价于:
select * from team,student where team.id=student.team_id ; team.id='team_a';
(瞎写的,这里我也不会写)
具体代码实例:
Session session=HibernateUtil.openSession(); //Team中有students,这里用Team和Student进行一个内连接查询 //这里就不再遵循映射配置的lazy,直接从两个表中获取查询的数据了。 Query query=session.createQuery("from Team t join t.students"); List list=query.list(); System.out.println(list.size()); session.close(); for(int i=0;i<list.size();i++){ //这里获取的数组,[0]是Team, [1]是Student Object[] obj=(Object[]) list.get(i); Team team=(Team) obj[0]; Student student=(Student)obj[1]; System.out.println(team.getName()+" : "+student.getName() ); System.out.println(student.getCourses().iterator().next()); //course的内容并没有通过HQL语句中查询,所以这里会报错no Session //System.out.println(obj[0]+", "+obj[1]); }
输出结果为:
drawer : alleni
drawer : eline
hunter : doudou
可以看出Hibernate将inner join查询到的内容通过HQL语句格式,分别放入查询表所映射的类对象实例中。
方法4.通过实例对象进行查询
Session session=HibernateUtil.openSession(); Team team=(Team)session.load(Team.class,"team_a"); System.out.println(team.getName()); Query query=session.createQuery("from Student s where s.team=:team and s.age >20" ); query.setEntity("team", team); //通过setEntity高速Hibernate where s.team=:team这里team对应的实例。 List list=query.list(); System.out.println(list.size()); //2 System.out.println(((Student)list.get(0)).getName());//alleni System.out.println(((Student)list.get(1)).getName()); //eline
方法5.通过条件过滤器进行查询
Session session=HibernateUtil.openSession(); Team team=(Team)session.load(Team.class,"team_a"); System.out.println(team.getName()); Query query=session.createFilter(team.getStudents(), "where age>20"); List list=query.list(); System.out.println(list.size()); System.out.println(((Student)list.get(0)).getName()); System.out.println(((Student)list.get(1)).getName());
这里通过过滤器查询, 查询结果和方法4的一样。
发表评论
-
Connection is read-only. Queries leading to data modification are not allowed。
2014-04-06 21:52 3648<tx:advice id="txAdvic ... -
org.hibernate.HibernateException: No Session found for current thread
2014-04-06 12:37 0今天在maven中整合spring和hibernate,并使用 ... -
select new Topic from ' Mysql 生成SQL语句错误
2014-03-30 22:51 1616Caused by: com.mysql.jdbc.exce ... -
Unable to locate appropriate constructor on class
2014-02-20 00:11 1421org.hibernate.hql.internal.ast. ... -
Hibernate的load和get实际应用区分简单实例
2013-12-18 11:58 829今天在看孔浩的CMS视频时候看到的。 在57 -文章管理06 ... -
自定义OpenSessionInViewer过滤器
2013-12-11 12:12 995摘自孔浩视频 spring部分-17_spring_SSH整合 ... -
数据库事务 (三)虚读(Phantom Read)
2013-12-01 13:21 0关于各种读 虚读 phantom read: 转自维基 ... -
Hibernate悲观锁
2013-11-30 17:30 0为了防止两个线程同时修改一个数据,造成更新数据丢失,我们可以使 ... -
QBC与HQL检索
2013-11-28 17:39 0QBC(Query By Criteria) API提供了检索 ... -
Hibernate继承映射
2013-11-28 12:36 611继承映射分为三种情况 1.每个子类一张表 比如说有一个Pers ... -
Hibernate通过Composite-element配置外联表实例 (码)
2013-11-28 11:07 982摘自圣思园Hibenrate 26. 组件映射深度解析 -37 ... -
Hibernate配置复合主键 composite primary key (二)
2013-11-27 16:41 1404摘自圣思园Hibernate 26.组件映射深度解析 上一篇 ... -
Hibernate配置复合主键 composite primary key (一)
2013-11-27 14:15 2409这篇是关于如何配置Hibernate实现复合主键的映射功能。 ... -
Hibernate通过Comparator接口自定义排序规则
2013-11-25 20:42 2471摘自圣思园 Hibernate25.自定义内存排序器详解及符合 ... -
Hibernate配置Set和List
2013-11-25 10:44 1839========================Set==== ... -
Hibernate的Map配置
2013-11-23 16:21 1257摘自圣思园022.Hibernate映 ... -
Hibernate多对多配置
2013-11-21 22:39 842场景: Student和Course,每一个Student有多 ... -
Hibernate延迟加载案例 (多: 一: 一,附代码)
2013-11-21 17:41 558摘自圣思园Hibernate20.一 ... -
Hibernate一对一配置
2013-11-20 21:49 997摘自圣思园 19.Hibernate的对象检索策略深度解析.a ... -
Hibernate的对象检索策略 (一) SQL左外连接检索策略
2013-11-20 15:32 1094首先是测试表的结构: 先通过hibernate将数据放入 ...
相关推荐
Hibernate实例开发 HQL 与 QBC 查询
主要介绍了Hibernate hql查询代码实例,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
hibernate 查询语言 HQL的使用详解及实例, 个人笔记,适合初学者
Hibernate、数据查询、HQL 入门 实例
这个实例是我看到得flex+hibernate 最经典的实例
今天小编就为大家分享一篇关于Hibernate中使用HQLQuery查询全部数据和部分数据的方法实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
主要介绍了JSP 开发之hibernate的hql查询多对多查询的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
hibernate HQL详细教程,简单易学易懂 1.1 HQL基础 2 1.1.1 默认数据库表和数据 2 1.1.2 检索类的所有对象 4 1.1.3 检索类的某几个属性 5 1.1.4 指定别名 5 1.1.5 where条件子句 5 1.1.6 使用distinct过滤掉重复值 6...
hibernate ORM的实例,包括一对一,一对多,多对一,多对多的各种实例。 还有一些HQL语句的写法
采用实例诠释hibernate查询的几种方式,比较容易上手,实用。
Hibernate基础知识,已实例的方式展现了hibernate的精髓,让我们从云里雾里的概念中脱离出来,从实战所需的角度来分析hibernate。
常见HQL语句的示例包括输出结果,以及语句的分析总结
hibernate3 hql语法,含大量实例源码。
hibernate+hql+大全,整理了常用的hql语句实例,能够更好的掌握hql语句的写法。
由于Hibernate是基于 JDBC的,所以它的数据库查寻的能力相对于CMP来说也是异常强大的,Hibernate自身也提供了HQL查寻语句。 一个最简单的Hibernate project(不涉及Struts, Tomcat, XDoclet,JBoss等东东)必须的...
HQL查询依赖于Query类,每个Query实例对应一个查询对象,使用HQL查询按 如下步骤进行: (1)获取Hibernate Session对象; (2)编写HQL语句; (3)以HQL语句作为参数,调用Session的createQuery方法创建查询对象; (4)...
通俗的语言加简洁的实例,快速带你进入HQL殿堂!!
相当好的文档 hql详细讲解 相当好的文档 相当好的文档 相当好的文档
本文档主要介绍hibernate主要包的作用,还有如何使用HQL查询,事务管理的详解,以及一对一、多对多、一对多、多对一关系的配置实例。还有配置文件中的各个属性的作用说明。