在Java的Hibernate框架中使用SQL语句的简单介绍

 更新时间:2016年01月03日 15:23:54   作者:cxshun  
这篇文章主要介绍了在Java的Hibernate框架中使用SQL语句的方法,Hibernate是Java的SSH三大web开发框架之一,需要的朋友可以参考下

Hibernate中有HQL查询语法。但我们用得比较熟的还是数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-query的callable属性设为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语句也是同样的配置。

相关文章

  • JAVA后端应该学什么技术

    JAVA后端应该学什么技术

    这篇文章主要介绍了JAVA后端应该学什么技术,对JAVA感兴趣的同学,可以规划一下
    2021-04-04
  • Spring5学习之基础知识总结

    Spring5学习之基础知识总结

    这篇文章主要介绍了Spring5学习之基础知识总结,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-05-05
  • Java分页查询--分页显示(实例讲解)

    Java分页查询--分页显示(实例讲解)

    下面小编就为大家带来一篇Java分页查询--分页显示(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • 在Spring Boot2中使用CompletableFuture的方法教程

    在Spring Boot2中使用CompletableFuture的方法教程

    这篇文章主要给大家介绍了关于在Spring Boot2中使用CompletableFuture的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧
    2019-01-01
  • myBatis的mapper映射文件之批量处理方式

    myBatis的mapper映射文件之批量处理方式

    这篇文章主要介绍了myBatis的mapper映射文件之批量处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 基于jQuery获取table数据发送到后端

    基于jQuery获取table数据发送到后端

    这篇文章主要介绍了基于jQuery获取table数据发送到后端,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • 一文带你了解Java中的函数式编程

    一文带你了解Java中的函数式编程

    函数式编程的理论基础是阿隆佐·丘奇(Alonzo Church)于 1930 年代提出的 λ 演算(Lambda Calculus)。这篇文章主要为大家介绍了函数式编程的相关知识,希望对大家有所帮助
    2023-04-04
  • 浅谈shiro的SecurityManager类结构

    浅谈shiro的SecurityManager类结构

    下面小编就为大家带来一篇浅谈shiro的SecurityManager类结构。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • 教你安装eclipse2021并配置内网maven中心仓库的图文详解

    教你安装eclipse2021并配置内网maven中心仓库的图文详解

    本文能通过图文并茂的形式给大家介绍安装eclipse2021并配置内网maven中心仓库的相关知识,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-09-09
  • 使用JPA自定义SQL查询结果

    使用JPA自定义SQL查询结果

    这篇文章主要介绍了使用JPA自定义SQL查询结果,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论