`

HQL学习(一)

 
阅读更多

HQL的定义:
HQL 是Hibernate Query Language的简写,即 hibernate 查询语言:

HQL采用面向对象的查询方式。HQL查询提供了更加丰富的和灵活的查询特性,因此Hibernate将HQL查询方式立为官方推荐的标准查询方 式,HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装。

 

用法:

在了解其用法之前,请先看下面的代码:

@SuppressWarnings("unchecked")
	public List<TCourse> getAllCourse(){  //查询所有的课程
		// TODO Auto-generated method stub
		List<TCourse> tc = null;  //定义集合
		
		try
		{
			HibernateUtil.beginSession(session);  //开始会话(调用HibernateUtil类中的方法)
			Query q = session.createQuery("from TCourse");  //创建查询,从课程表中查询
			tc = (List<TCourse>) q.list();  //获取的数据放在集合内
			//if(commit)
			HibernateUtil.commitTransaction(session);  //提交事务
		}
		catch(RuntimeException e)
		{
			HibernateUtil.rollbackTransaction(session);  //若有异常的话,就回滚
			throw e;
		}
		return tc;
	}

 

 

上面的代码中查询语句就运用到HQL语言。

完整的HQL语句形式如下:
Select/update/delete……from……where……groupby……having……orderby……asc/desc
其中的update/delete为Hibernate3中所新添加的功能,可见HQL查询非常类似于标准SQL查询。

 

1:实体查询:
例子如下:
String hql=”from User user”;
List list=session.CreateQuery(hql).list();
上面的代码执行结果是,查询出User实体对象所对应的所有数据,而且将数据封装成User实体对象,并且放入List中返回

 

2:实体的更新和删除:

例子如下:

更新的:

Transaction trans=session.beginTransaction();
String hql=”update User user set user.age=20 where user.age=18”;
Query queryupdate=session.createQuery(hql);
intret=queryupdate.executeUpdate();
trans.commit();

删除的:

Transaction trans=session.beginTransaction();
Stringhql=”delete from User user where user.age=18”;
Queryqueryupdate=session.createQuery(hql);
intret=queryupdate.executeUpdate();
trans.commit();

 

3、属性查询:
很多时候我们在检索数据时,并不需要获得实体对象所对应的全部数据,而只需要检索实体对象的部分属性所对应的数据。这时候就可以利用HQL属性查询技术,如下面程序示例:
List list=session.createQuery(“select user.name from User user”).list();
for(int i=0;i<list.size();i ){
System.out.println(list.get(i));
}
我们只检索了User实体的name属性对应的数据,此时返回的包含结果集的list中每个条目都是String类型的name属性对应的数据。我们也可以一次检索多个属性,如下面程序:
List list=session.createQuery(“select user.name,user.age from User user ”).list();
for(int i=0;i
Object[] obj=(Object[])list.get(i);
System.out.println(obj[0]);
System.out.println(obj[1]);
}
此时返回的结果集list中,所包含的每个条目都是一个Object[]类型,其中包含对应的属性数据值。作为当今我们这一代深受面向对象思想 影响的开发人员,可能会觉得上面返回Object[]不够符合面向对象风格,这时我们可以利用HQL提供的动态构造实例的功能对这些平面数据进行封装,如 下面的程序代码:
Listlist=session.createQuery(“selectnewUser(user.name,user.age)fromUseruser”).list();
for(inti=0;i
Useruser=(User)list.get(i);
System.out.println(user.getName());
System.out.println(user.getAge());
}
这 里我们通过动态构造实例对象,对返回结果进行了封装,使我们的程序更加符合面向对象风格,但是这里有一个问题必须注意,那就是这时所返回的User对象, 仅仅只是一个普通的Java对象而以,除了查询结果值之外,其它的属性值都为null(包括主键值id),也就是说不能通过Session对象对此对象执 行持久化的更新操作。如下面的代码:
Listlist=session.createQuery(“selectnewUser(user.name,user.age)fromUseruser”).list();
for(inti=0;i
Useruser=(User)list.get(i);
user.setName(“gam”);
session.saveOrUpdate(user);// 这里将会实际执行一个save操作,而不会执行update操作,因为这个User对象的id属性为null,Hibernate会把它作为一个自由对象 (请参考持久化对象状态部分的论述),因此会对它执行save操作。
}

 

4.分组与排序
Order by子句:
     from TUser user order by user.name, user.age desc
Group by子句和Having子句
     "select count(user), user.age from TUser user group by user.age having count(user)>10"

5.参数邦定
通过顺序占位符?来填充参数:
1)hibernate 2 中通过session.find方法来填充
        session.find("from TUser user where user.name=?", "Erica", Hibernate.STRING);
   多个参数的情况:
        Object[] args = new Object[] {"Erica", new Integer(20)};
        Type[] types = new Type{Hibernate.STRING, Hibernate.INTEGER};
        session.find("from TUser user where user.name=? and user.age=?", args, types);

2)通过Query接口进行参数填充:
         Query query = session.createQuery("from TUser user where user.name=? and user.age>?");
         query.setString(0,"Erica");
         query.setInteger(1, 20);

通过引用占位符来填充参数:
         String hql = "from TUser where name=:name";
         Query query = session.createQuery(hql);
         query.setParameter("name","Erica");

甚至可以将查询条件封装为一个JavaBean
class UserQuery {
     private String name;
     private Integer age;
     //getter and setter
}
String hql = "from TUser where name=:name and age=:age";
Query query = session.createQuery(hql);
UserQuery uq = new UserQuery();
uq.setName("Erica");
uq.setAge(new Integer(20));

query.setProperties(uq); //会调用里面的getter?
query.iterate();

6.联合查询
也可以使用 inner join,left outer join, right out join, full join
排列组合:form TUser, TAddress

 

其中内容一些是参考别人的,一些是自己的想法,留着以后参考用的!!

分享到:
评论

相关推荐

    HQL语法入门学习HQL语法入门学习

    在深入探讨HQL语法之前,我们首先需要理解什么是HQL。HQL,全称为Hibernate Query Language,是Hibernate框架提供的一种面向对象的查询语言。...通过学习和熟练掌握HQL,可以提高开发效率,使代码更加易于理解和维护。

    HQL学习大全.rar

    标题中的“HQL学习大全.rar”表明这是一份关于HQL(Hibernate Query Language)的综合学习资源包。HQL是Hibernate框架中用于操作对象关系映射(ORM)的查询语言,它模仿了SQL的语法,但操作的是面向对象的数据。 ...

    学习HQL语句

    HQL(Hibernate Query Language)是一种面向对象的查询语言,建立在面向对象的基础上。它提供了类SQL查询的功能,但查询目标是对象,而不是记录。HQL 拥有面向对象语言的所有特性,包括多态、继承和组合。 一、投影...

    HQL学习教程Hibernate入門

    **HQL学习教程Hibernate入门** Hibernate是一个开源的Java ORM(对象关系映射)框架,它允许开发者用面向对象的方式操作数据库。HQL(Hibernate Query Language)是Hibernate提供的一种面向对象的查询语言,与SQL...

    hql语句的学习,很有用的东西

    HQL(Hibernate Query Language)是Hibernate提供的一种面向对象的查询语言,它允许开发者使用类和属性的名字来查询数据,而非传统的基于表格和列名的SQL。本篇文章将深入探讨HQL语句的学习及其在Hibernate中的应用...

    Hibernate 课件_HQL

    - **定义**: HQL(Hibernate Query Language)是一种面向对象的查询语言,它的语法类似于SQL,但不同于直接操作数据库表,HQL操作的是持久化的Java对象。这意味着在编写查询时,可以使用Java对象模型中的类名和属性...

    HQL是hibernate自己的一套查询

    2. **易于理解**:HQL的语法结构清晰,容易理解和学习。 3. **平台无关**:由于HQL是基于Hibernate框架的查询语言,因此不受特定数据库的影响,可以在不同的数据库平台上无缝迁移。 4. **灵活性**:HQL支持多种查询...

    Hibernate之HQL查询

    通过学习和实践HQL,开发者可以更好地利用Hibernate的强大功能,提高代码的可读性和可维护性。在实际项目中,结合HQL和 Criteria 查询,以及Querydsl等工具,可以构建更加灵活和健壮的数据访问层。在进行HQL编程时,...

    Hibernate查询语言HQL.PPT

    * HQL 是一种面向对象的查询语言,易于学习和使用。 * HQL 提供了灵活多样的查询机制。 * HQL 可以检索对象的各种方式。 HQL 的基本语法: * from 子句:在 Hibernate 中实现数据库表中的数据查询。 * select 子句...

    精通HQL(word格式)

    在学习HQL时,通常会基于一个预先设定的数据库环境。在这个例子中,使用了一个名为joblog的数据库,包含三个表:student(学生表),course(课程表)和sc(选课表)。每个表都有相应的Java持久化类,例如Student、...

    03-HQL实用技术.pdf

    ### HQL实用技术知识点概述 ...通过对以上知识点的学习,可以深入理解HQL在处理不同场景下的应用技巧,特别是关联关系的配置和HQL查询的使用。这些知识不仅有助于提高软件开发的效率,还能提升系统的健壮性和可维护性。

    HQL语言大全 高清晰可复制版

    例如,一个简单的HQL查询可能如下所示: ```sql FROM Employee e WHERE e.name = 'John' ``` 这条语句将返回所有名字为'John'的员工对象。 3. **HQL的查询类型** - **基本查询**:如上所示,从一个实体类中...

    精通hibernate HQL语言

    在学习HQL基础时,我们通常会用到一些示例数据。在这个例子中,我们有三个数据库表:`student`(学生表)、`course`(课程表)和`sc`(选课表)。`student`表包含学生的学号(`sno`)、姓名(`sname`)、性别(`ssex...

    HQL查询及语法

    #### 一、HQL简介 HQL,全称为Hibernate Query Language,是Hibernate框架提供的一种面向对象的查询语言。它基于SQL标准,但更加强调对象模型,支持Java中的对象关系映射(ORM),能够处理继承、多态等特性,使...

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

    为了更深入地学习Hibernate和HQL,建议阅读以下资源: - Hibernate官方文档:提供了最全面的Hibernate和HQL的使用指南。 - 《Hibernate: A Developer's Notebook》:一本由Craig Walls撰写的书,适合初学者快速上手...

    HQL语法大全,并带有详细的例子

    ### HQL语法详解及其应用案例 ...通过对上述内容的学习,相信你已经对HQL的基本语法和使用有了较为深入的理解。在实际开发中,合理运用HQL不仅可以提高查询效率,还能增强代码的可读性和可维护性。

    HibernateUtil分装完整版HQL查询

    标题"HibernateUtil分装完整版HQL查询"暗示了这是一个关于使用HibernateUtil工具类来封装和执行HQL(Hibernate Query Language)查询的教程或代码示例。描述中的重复信息进一步强调了这个主题,意味着我们将探讨如何...

    强烈建议的HQL语法规则详解

    在Java开发中,尤其是涉及到持久化操作时,Hibernate Query Language(HQL)是不可或缺的一部分。...通过学习和实践HQL,你可以更好地理解和利用Hibernate的面向对象特性,实现高效、灵活的数据访问。

    Hibernate-HQL.rar_HQL_hibernate hql

    HQL的灵活性在于它可以处理对象关系,例如一对一、一对多、多对多的关系。在SQL中,处理这些关系通常需要复杂的联接操作,而在HQL中则相对简单。此外,HQL支持动态查询,可以方便地处理集合类型的参数。 四、HQL的...

Global site tag (gtag.js) - Google Analytics