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

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
, sql
, 数据库
hibernate
java框架hibernate、java 简单框架、java最简单的mvc框架、简单的javaweb框架、java 简单的缓存框架,以便于您获取更多的相关知识。

时间: 2024-09-17 03:11:48

在Java的Hibernate框架中使用SQL语句的简单介绍_java的相关文章

Java的Hibernate框架中Criteria查询使用的实例讲解_java

我们讲一下Criteria查询,这个对于不是太熟悉SQL语句的我们这些程序员来说是很容易上手的.  废话不多说,看一下例子:  实体类如下: public class User implements Serializable{ private static final long serialVersionUID = 1L; public Long id; private String name; private int age; //省略Get/Set方法 }   映射文件我们就不写了,很简单的

在Java的Hibernate框架中对数据库数据进行查询操作_java

Hibernate查询语言(HQL)是一种面向对象的查询语言,类似于SQL,但不是对表和列操作,HQL适用于持久对象和它们的属性. HQL查询由Hibernate转换成传统的SQL查询,这在圈上的数据库执行操作. 虽然可以直接使用SQL语句和Hibernate使用原生SQL,但建议使用HQL尽可能避免数据库可移植性的麻烦,并采取Hibernate的SQL生成和缓存策略的优势. 都像SELECT,FROM和WHERE等关键字不区分大小写,但如表名和列名的属性是区分在HQL敏感. FROM 语句使用

Java的Hibernate框架中集合类数据结构的映射编写教程_java

一.集合映射 1.集合小介集合映射也是基本的映射,但在开发过程中不会经常用到,所以不需要深刻了解,只需要理解基本的使用方法即可,等在开发过程中遇到了这种问题时能够查询到解决方法就可以了.对应集合映射它其实是指将java中的集合映射到对应的表中,是一种集合对象的映射,在java中有四种类型的集合,分别是Set.Map.List还有普通的数组,它们之间有很大的区别: (1)Set,不可以有重复的对象,对象是无序的: (2)List,可以与重复的对象,对象之间有顺序: (3)Map,它是键值成对出现的

解析Java的Hibernate框架中的持久化类和映射文件_java

持久化类Hibernate的整个概念是采取从Java类属性的值,并将持久到数据库表.一个映射文件Hibernate的帮助确定如何从拉动类的值,并将它们映射与表和相关的域. 其对象或实例将存储在数据库表中的Java类在Hibernate中称为持久化类. Hibernate的效果最好,如果这些类遵循一些简单的规则,也称为普通Java对象(POJO)编程模型.有下列持久化类的主要规则,但是,这些规则并不是必需的. 将所有的持久化Java类需要一个默认的构造函数. 所有类应该包含为了让容易识别对象内Hi

Java的Hibernate框架中用于操作数据库的HQL语句讲解_java

 上次我们一起学习了用Criteria进行相关的操作,但由于Criteria并不是Hibernate官方推荐的查询方式,我们也并不多用.现在我们来看一下官方推荐的HQL,一起学习一下它的强大.  说是HQL,也就是Hibernate查询语句,和SQL有什么区别呢?一个字母的区别,哈哈.  当然不是这样,HQL和SQL的区别在于思想的不同,HQL是用面向对象的方向进行查询,而SQL则是对数据库二维表进行查询,这里包含的是思想的不同.HQL实际上也是SQL,它由Hibernate帮我们在内部进行转换

通过java程序抽取日志中的sql语句

今天在翻看以前的笔记时,发现自己在很早之前写过一个java程序,能够解析日志中的sql语句. 当时使用的环境是weblogic,日志目录下总是有几十上百个日志文件,有时候排查问题的时候只需要找到对应的DML语句即可. 使用linux命令固然也可以,但是解析的时候还是比较被动,不能够正确地解析出sql语句来.比如日志中出现insert的字样可能只是日志中的一段信息,不是insert语句. 这些通过linux命令来完成还是有一定的难度,记得当时问题比较多,自己也饱受这种困扰.于是写了一个java程序

详解Java的Hibernate框架中的缓存与原生SQL语句的使用_java

Hibernate缓存缓存是所有关于应用程序的性能优化和它位于应用程序和数据库之间,以避免数据库访问多次,让性能关键型应用程序有更好的表现. 缓存对Hibernate很重要,它采用了多级缓存方案下文所述: 第一级缓存: 第一级缓存是Session的缓存,是一个强制性的缓存,通过它所有的请求都必须通过. Session对象不断自身的动力的对象,提交到数据库之前. 如果发出多个更新一个对象,Hibernate试图拖延尽可能长的时间做了更新,以减少发出的更新SQL语句的数量.如果您关闭会话,所有被缓存

详解Java的Hibernate框架中的Interceptor和Collection_java

Interceptor讲到Interceptor,相信熟悉struts2的童鞋肯定不会陌生了,struts2可以自定义拦截器进行自己想要的一系列相关的工作.而这里我们说的Interceptor也是差不多相似的功能.  废话不说,直接来代码:  下面这个是MyInterceptor类,它实现了Interceptor接口: public String onPrepareStatement(String arg0) { return arg0; } public boolean onSave(Obje

详解Java的Hibernate框架中的注解与缓存_java

注解Hibernate注解是一个没有使用XML文件来定义映射的最新方法.可以在除或替换的XML映射元数据使用注解. Hibernate的注解是强大的方式来提供元数据对象和关系表的映射.所有的元数据被杵到一起的代码POJO java文件这可以帮助用户在开发过程中同时要了解表的结构和POJO. 如果打算让应用程序移植到其他EJB3规范的ORM应用程序,必须使用注解来表示映射信息,但仍然如果想要更大的灵活性,那么应该使用基于XML的映射去. 环境设置Hibernate注释 首先,必须确保使用的是JDK