`

Hibernate查询HQL实例

阅读更多
三个实体类对象:
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的一样。
  • 大小: 69.4 KB
分享到:
评论

相关推荐

    Hibernate查询语言HQL.PPT

    Hibernate 查询语言 HQL Hibernate 查询语言 HQL 是一种面向对象的查询语言,用于检索对象。它提供了灵活多样的查询机制,包括导航对象图、通过标识符检索、使用 HQL 检索对象、使用 Hibernate 条件 API 和使用本地...

    hibernate查询之HQLhibernate查询之HQL

    Hibernate查询之HQL是ORM(对象关系映射)框架Hibernate中的一个重要组成部分,它是一种面向对象的查询语言,与SQL有着显著的区别。HQL允许开发者使用类名和属性而不是表名和列名进行查询,从而更好地适应面向对象的...

    Hibernate hql查询语法总结

    本文将对Hibernate HQL查询语法进行总结,涵盖基础查询、属性查询、实例化查询以及查询链接等多个方面。 1. 基础查询: 基础查询是最简单的HQL语句,用于获取所有`Student`对象。例如: ```java from Student ``` ...

    Hibernate-HQL-查询-Query资料

    在Hibernate中,HQL(Hibernate Query Language)是专为ORM设计的一种面向对象的查询语言,它允许开发者以类和对象的方式进行数据查询,而不是直接使用SQL。本资料主要涵盖了Hibernate HQL查询的基本概念、语法以及...

    Hibernate 课件_HQL

    ### Hibernate 课件_HQL 知识点解析 #### HQL查询 ...这些知识点涵盖了HQL的基本概念、查询方法、各种高级查询技巧以及Session的管理等方面,希望能够帮助大家更好地理解和掌握Hibernate的HQL查询技术。

    hibernate 中HQL语句查询学习笔记

    ### Hibernate中HQL语句查询学习笔记 #### HQL基础 **HQL**(Hibernate Query Language)是Hibernate框架推荐使用的查询语言,它提供了一种面向对象的方式来查询数据库,支持多种复杂的查询操作,如继承、多态及...

    Hibernate_HQL大全

    HQL,即Hibernate Query Language,是一种强大且面向对象的查询语言,由Hibernate框架提供。尽管HQL的语法结构与SQL相似,但其设计理念完全不同,HQL是专门为面向对象的数据查询而设计的。它能够理解和处理诸如继承...

    Hibernate的HQL与Criteria资料

    本资料主要探讨的是Hibernate中的两种查询方式:HQL(Hibernate Query Language)和Criteria API。 HQL,全称为Hibernate查询语言,是Hibernate提供的一种面向对象的查询语言,类似于SQL,但更加面向对象。HQL直接...

    Hibernate实例开发 HQL 与 QBC 查询

    本教程将深入探讨Hibernate中的两种查询方式:HQL(Hibernate Query Language)和QBC(Query By Example)。通过实例开发,我们将了解这两种查询方法的使用和它们之间的差异。 首先,HQL是Hibernate专门设计的一种...

    hibernate-hql 资料大全

    Hibernate HQL,全称为Hibernate Query Language,是Hibernate框架中用于操作对象关系映射(ORM)的查询语言。它类似于SQL,但设计目的是针对Java对象,而不是数据库表。HQL允许开发者以面向对象的方式编写查询,...

    hibernate的hql语句

    2. **from子句**:基本的HQL查询以`from`开头,例如`from eg.Cat`,这将返回所有`eg.Cat`类的实例。在默认情况下,Hibernate会自动导入类,所以通常不需要全限定名。为了方便后续查询,可以为类指定别名,如`from ...

    Hibernate教程(数据查询)HQL,PDF格式

    这里,查询字符串"from User"告诉Hibernate检索`User`类的所有实例。 #### HQL查询的灵活性 HQL不仅支持全表扫描,还支持条件查询、联接查询、分组、排序等复杂操作。例如,下面的代码展示了如何根据年龄筛选用户...

    Hibernate-HQL-QBC-QBE

    2. HQL(Hibernate Query Language):HQL是Hibernate提供的面向对象的查询语言,类似于SQL,但它是针对对象而不是表格进行操作的。HQL允许开发者以类和对象的方式编写查询,支持复杂的查询结构,如连接、子查询、...

    HQL是hibernate自己的一套查询

    根据提供的标题、描述以及部分代码内容,我们可以了解到这段材料主要涉及的是Hibernate框架中的HQL(Hibernate Query Language)查询语言的使用。接下来将详细介绍HQL的相关知识点。 ### HQL概述 HQL是Hibernate...

    hibernate 的HQL 语言入门与提高

    基础的 HQL 查询始于 `from` 子句,例如 `from eg.Cat` 返回 `eg.Cat` 类的所有实例。默认情况下,Hibernate 支持自动引入,因此通常不需要全限定类名。为方便后续查询,可以给类指定别名,如 `from Cat as cat`。多...

    一个Hibernate的简单实例

    除了基本的CRUD操作,Hibernate还支持复杂的查询功能,如JOIN、GROUP BY、HAVING等,可以使用HQL(Hibernate Query Language)或者Criteria API实现。例如,查询所有用户名为"testUser"的用户: ```java String hql...

    Struts2_Spring_Hibernate整合开发实例

    Hibernate的HQL(Hibernate Query Language)和Criteria API则提供了便捷的查询方式,避免直接编写SQL,提高了代码的可读性和可维护性。 在这个实例中,开发者将学习如何配置struts2.xml、spring-context.xml和...

    hibernate查询语句--HQL

    ### Hibernate 查询语句 -- HQL #### 概述 Hibernate 是一个开源的对象关系映射 (ORM) 框架,它允许开发人员将 Java 对象映射到数据库表中的记录,从而简化了数据访问逻辑。在 Hibernate 中,执行查询操作的主要...

    hibernate hql各类查询范例

    以上内容涉及了使用 HQL 和 DetachedCriteria 进行查询、参数化查询、执行更新操作以及简单的统计查询等常见的 Hibernate 操作。这些知识点对于理解和掌握 Hibernate 框架的基本使用至关重要,同时也是开发基于 ...

Global site tag (gtag.js) - Google Analytics