`
cxshun
  • 浏览: 724579 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

hibernate之HQL(3)

阅读更多

我们在之前一起学习了HibernateHQL查询语法。但我们用得比较熟的还是数SQL语句,那么应该怎么来让Hibernate支持SQL呢?这个不用我们去考虑了,Hibernate团队已经早就做好了。

       废话不说,直接来例子啦。

select * from t_user usr

  上面是一条SQL语句,又是废话,是个人都知道。我们想让Hibernate执行这条语句,怎么办呢?看代码:

Query query = session.createSQLQuery("select * from t_user usr");

  就这样,剩下来的,大家应该都知道了,平常的查询。

        那查询完之后,返回的是什么东西呢?

while(iter.hasNext()){
	Object[] objs = (Object[])iter.next();
	for (int i = 0; i < objs.length; i++) {
		System.out.print(objs[i]);
	}
	System.out.println();
}

  返回的每个结果都是Object[]数组,

      

        这时又有人跑出来说面向对象啦。对,就是面向对象,唉,没办法。

        我们继续看:

select {usr.*} from t_user usr

  看到这里,估计某些童鞋开始鸡动啦,那个大括号什么东西啦?

    别急,慢慢来。我们先继续看代码。

Query query = session.createSQLQuery("select {usr.*} from t_user usr").addEntity(TUser.class);

  我们看到跟前面不同的是,我们加了一个addEntity,是什么意思呢?

    我们直接API,看到这样一串解释:

    addEntity

SQLQuery addEntity(String tableAlias,

                   Class entityType)

Declare a "root" entity

Parameters:

tableAlias - The SQL table alias

entityType - The java type of the entity to add as a root

       有跟没一个样,杯具。只能自己动手用用。

       第一个参数是指表的别名,就像上面的语句,我们表的别名是usr,所以第一个参数为usr,而第二个是指查询到的结果需要映射到哪个类,这里由于我们在映射文件中是通过TUser映射到t_user表,所以我们这里当然也就是TUser啦。然后一查,有SQL语句出来,而且查到的结果是TUser类型的。

       我们查到的结果是:

org.hibernate.tutorial.domain6.TUser@198cb3d

  当然,你们的肯定跟我不一样的。不要鸡动。

 

    也许我们并不需要全部进行查出,这时,我们需要的只是设定别名即可:

select u.id as {usr.id},u.name as {usr.name},u.age as {usr.age} from t_user u

  我们看到我们用了as指定了字段的别名,程序中还是一样:

Query query = session.createSQLQuery("select u.id as {usr.id},u.name as {usr.name},u.age as {usr.age} from t_user u").addEntity("usr",TUser.class);

  这个简单,不多说。

 

         以前我们讲到,有些团队会规定不给在代码中写SQL语句,这又需要配置文件出马啦。

         我们可以在配置文件中添加:

<sql-query name="queryTUser">
	<return alias="usr" entity-name="org.hibernate.tutorial.domain6.TUser" />
	select {usr.*} from t_user usr where name=:name
</sql-query>

  注意,这里的entity-name需要写完整的包名,不然会报错的。这里我们有子标签return,它指定了表的别名和类名,这样我们在运行时就不需要再addEntity了。

    看代码:

Query query = session.getNamedQuery("queryTUser");
query.setParameter("name","shun");
List list = query.list();
Iterator iter = list.iterator();

  我们直接这样就OK了,注意,我们并没有加addEntity了,主要还是归功于配置文件中的配置。

    注意,如果在配置文件中配置,一定要有return子标签指定表别名和类名。这个主要是避免了我们读取语句时的重复判断。

   

 

    上面讲了这么久,我们一直在讲有别名的表,那么如果我们的表没有别名,但又想返回的结果封装在对象内,我们应该怎样呢?

select * from t_user usr

  很简单,只要调用addEntity的重载方法addEntity(Class clazz)就行了,只需要提供一个类名,而不需要表别名。

 

    当然,hibernate也支持存储过程,只需要在配置文件中把sql-querycallable属性设为true即表示当前调用的是存储过程,由于存储过程我接触地不多,以后多研究一下再跟大家一起研究。

   

    我们在调用session.save等相应的对数据操作的方法时,它会转换成hibernate内置的SQL语句,但如果我们想自己控制SQL语句的格式呢,怎么办?

    Hibernate实际上也想到了。

    我们直接在映射文件中加入:

<sql-insert>
		INSERT INTO T_USER (NAME,AGE) values (?,?)
	</sql-insert>
	<sql-update>
		UPDATE USER SET USER_NAME=?,AGE=? WHERE uSER_ID=?
</sql-update>	

  注意,这个需要添加在class标签内,作为子标签。我们这里全部是大写字母,是为了跟hibernate默认的语句分清,没有其他意思。

    我们先来看一下insert的调用:

User user = new User();	
user.setName("shun123123");
user.setAge(23);

  当我们调用保存时,hibernate的语句是:

Hibernate: INSERT INTO USER(USER_NAME,AGE) values(?,?)

  它调用了我们配置的sql-insert标签内的语句

我们再来看一下update的调用:

 

User user = (User)session.get(User.class,new Long(29));
user.setName("shun123123");
user.setAge(23);
session.save(user);

  我们调用保存,它会自动调用更新,此时的语句是:

Hibernate: UPDATE USER SET USER_NAME=?,AGE=? WHERE uSER_ID=?

  我们看到输出的语句是大写的,也就是调用了我们配置的语句。

 

    delete语句也是同样的配置。

 

我们这些基础的就学到这里啦,接下来的我们就会一起学习一下"高级"的东西。

 

0
1
分享到:
评论

相关推荐

    weblogic12 下 org.hibernate.hql.ast.HqlToken

    ### WebLogic 12下org.hibernate.hql.ast.HqlToken冲突解决方案 在使用WebLogic 12部署应用程序时,可能会遇到与`org.hibernate.hql.ast.HqlToken`相关的异常问题。这种异常通常与Hibernate版本之间的不兼容性有关...

    hibernate-HQL语句大全

    hibernate-HQL语句大全

    hibernate查询之HQLhibernate查询之HQL

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

    Hibernate_HQL.rar_hibernate HQL_hibernate hql src

    对hibernate的hql进行了详尽的讲解

    Hibernate-HQL.rar_HQL_hibernate hql

    本篇文档将深入探讨Hibernate中的HQL(Hibernate Query Language),一种面向对象的查询语言,它提供了与SQL类似的语法,但更贴近于面向对象的思维模式,使得开发者可以更加便捷地进行数据查询。 一、HQL简介 HQL是...

    Hibernate(HQL、QBC查询)源码

    Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码

    Hibernate之HQL查询

    在Hibernate中,HQL(Hibernate Query Language)是其内置的一种面向对象的查询语言,它是SQL的面向对象版本,用于检索和操作持久化对象。HQL查询的使用极大地提高了开发效率,因为它将数据操作与具体的数据库结构...

    hibernate3-hql.jar

    hibernate3-hql.jar .

    Hibernate hql查询语法总结

    《Hibernate HQL查询语法详解》 Hibernate,作为Java领域中广泛应用的对象关系映射(ORM)框架,极大地简化了数据库操作。其内置的HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者以类和...

    Hibernate-HQL语句多对多写法

    "Hibernate-HQL语句多对多写法" Hibernate 是一个流行的 Java 持久层框架,它提供了强大的对象关系映射(ORM)功能,使得开发者可以方便地与数据库交互。但是,在使用 Hibernate 时,我们经常会遇到多对多关系的...

    Hibernate查询语言HQL.PPT

    3. 使用 HQL 检索对象:使用 Hibernate 查询语言 HQL 检索对象。 4. 使用 Hibernate 条件 API:提供了类型安全的面向对象的方式执行查询。 5. 使用本地 SQL 查询:Hibernate 只关心把 JDBC 结果集映射到持久对象图。...

    Hibernate 课件_HQL

    ### Hibernate 课件_HQL 知识点解析 #### HQL查询 - **定义**: HQL(Hibernate Query Language)是一种面向对象的查询语言,它的语法类似于SQL,但不同于直接操作数据库表,HQL操作的是持久化的Java对象。这意味着...

    hibernateHQL关联查询

    其中,HQL(Hibernate Query Language)作为Hibernate提供的查询语言之一,允许开发者以接近面向对象的方式编写查询语句。本文将重点介绍Hibernate中的关联查询,并深入探讨HQL关联查询的实现原理及应用场景。 ####...

    hibernate 查询?Hibernate的HQL查询

    Hibernate作为流行的Java ORM框架,它的查询机制是其独特之处。其中,Criteria Query允许通过对象模型进行查询,提高了代码的可读性,但不支持所有复杂的SQL操作。而HQL则弥补了这一不足,它是一种面向对象的查询...

    hibernate的HQL的jar

    在Hibernate 3中,引入了对HQL的广泛支持,同时提供了很多新特性,如 Criteria API、CGLIB代理和更多的性能优化。 使用Hibernate和HQL进行开发时,有以下几点需要注意: 1. **配置**:必须在Hibernate配置文件...

    Hibernate的HQL查询

    hibernate hql 语法学习的文档

    Hibernate的HQL讲解

    对Hibernate中HQL语句的讲解

    hibernate的HQL的模糊查询

    在Java的持久化框架Hibernate中,HQL(Hibernate Query Language)是专为ORM(对象关系映射)设计的一种SQL方言,用于对数据库进行操作。HQL模糊查询是开发者在进行数据检索时常用的一种功能,它允许我们根据部分...

    hibernate-hql 资料大全

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

    hibernate_hql.rar_HQL

    其中,Hibernate查询语言(HQL)是其核心特性之一,它为开发者提供了一种面向对象的查询方式,类似于SQL,但更贴近于Java的编程思维。本篇文章将深入探讨HQL的使用、特点以及在实际项目中的应用。 首先,HQL是...

Global site tag (gtag.js) - Google Analytics