`
esffor
  • 浏览: 1367805 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hibernate数据查询

阅读更多
导读:
  Hibernate Query Language(HQL)
  Criteria Query
  Native SQL
  下面对其分别进行解释
  Hibernate Query Language:
  HQL提供了是十分强大的功能,它是针对持久化对象,用取得对象,而不进行update,delete和insert等操作。而且HQL是面向对象的,具备继承,多态和关联等特性。
  from子句:
  from子句是最简单的HQL,例如from Student,也可以写成 select s from Student s。它简单的返回Student类的所有实例。
  值得注意的是除了JAVA类和属性的名称外,HQL语句对大小写不敏感。
  select子句:
  有时并不需要取得对象的所有属性,这时可以使用select子句进行属性查询,如select s.name from Student s。
  例:
  
  
  public void HQLselectDEMO()
  
  
  
  
  
  
  {
  
  
  TRegister user = new TRegister();
  
  
  Session session = HibernateUtil.currentSession();
  
  
  Query query = session.createQuery("select u.userName from TRegister u");
  
  
  List list = query.list();
  
  
  for(int i = 0 ; i < list.size(); i++)
  
  
  
  
  
  
  {
  
  
  String name = (String)list.get(i);
  
  
  System.out.println(name);
  
  
  }
  
  }
  如果要查询两个以上的属性桧以数组的方式返回,如下:
  
  
  public void HQLselectDEMO()
  
  
  
  
  
  
  {
  
  
  TRegister user = new TRegister();
  
  
  Session session = HibernateUtil.currentSession();
  
  
  Query query = session.createQuery("select u.userName ,u.sex from TRegister u");
  
  
  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]);
  
  
  }
  
  }
  在使用属性查询时,由于使用对象数组,操作和理解不太方便,如果将 一个object[]中所有成员封装成一个对象就方便多了。下面的程序做了示例:
  
  
  public void HQLselectDEMO()
  
  
  
  
  
  
  {
  
  
  Session session = HibernateUtil.currentSession();
  
  
  Query query = session.createQuery("select new TRegister(u.userName,u.sex) from TRegister u");
  
  
  List list = query.list();
  
  
  for(int i = 0 ; i < list.size(); i++)
  
  
  
  
  
  
  {
  
  
  //Object obj[] = (Object[])list.get(i);
  
  TRegister user = (TRegister)list.get(i);
  
  
  System.out.println(user.getUserName()+" 的性别是:"+user.getSex());
  
  
  }
  
  
  
  /** *//**要正确运行以上程序,需要在TRegister类中加入一个相应的构造函数
  
  
  public TRegister(String userName,String sex) {
  
  
  this.userName = userName;
  
  
  this.sex = sex;
  
  
  }
  
  
  */
  
  }
  统计函数查询可以在HQL中使用函数,经常使用的函数如下:
  count():统计记录条数。
  min():求最小值。
  max():求最大值。
  sum():求和。
  avg():求平均值。
  例如,要取得Student实例的数量,可以编写如下HQL语句:
  select count(*) from Student
  取得Student平均年龄的HQL语句:
  select avg(s.age) from Student as s
  可以使用distinct去除重复的数据:
  select distinct s.age from Student as s
  where子句:
  HQL也支持子查询,它通过where子句实现这一机制。where子句可以让用户缩小要返回的实例的列表范围。例如下面语句会返回所有名字为"Bill"的Student实例:
  Query query = session.createQuery("from Student as s where s.name='Bill'");
  where子句允许出现的表达式包括了SQL中可以使用的大多数情况。
  数学操作:+,-,*,/
  真假比较操作:=, >=, <=, <>, !=, like
  逻辑操作:and ,or, not
  字符串连接:||
  SQL标题函数 :如upper()和lower()
  如果查询返回多条记录,可以用以下关键字来量化
  all:表示所有的记录。
  any:表示所有记录中的任意一条。
  some:与any相同。
  in:与any等价。
  exists:表示子查询至少要返回一条记录。例如,下面语句返回所有学生年龄都大于18的班级对象
  from Group g where 18<all <br="" s)="" g.students="" from="" s.age="" (select="">  下列语句返回在所有学生中有一个学生的年龄等于22的班级:
  from Group g where 22 = any (select s.age from g.students s)
  或者
  from Group g where 22= some(select s.age from g.students s)
  或者
  from Group g where 22 in (select s.age from g.students s)
  order by子句查询返回列表可以按照任何返回的类或者组件的属性排序
  from Student s order by s.name asc
  连接查询
  与SQL一样,HQL也支持连接查询,如内连接,外连接和交叉连接:
  inner join:内连接
  left outer join:左外连接
  rigth outer join:右外连接
  full join:全连接,但不常用
  下面我重点介绍下内连接查询,左外连接和或外连接和内连接大同小异,而全连接几乎没有使用得到的地方。
  inner join可以简写为join,例如在查询得到的Group对象时,内连接取得对应的Student对象,实现的程序代码如下:
  
  
  Student stu = null
  
  Group group = null
  
  Query query = session.createQuery("from Group g join g.students");
  
  
  List list = query.list();
  
  
  Object obj[] = null
  
  for(int i = 0 ; i < list.size(); i++)
  
  
  
  
  
  
  {
  
  
  obj = (Object[])list.get(i);
  
  
  group = (Group)obj[0];//group是数组是第一个对象
  
  stu = (Student)obj[1];//stu是数组的第二个对象
  
  System.out.println(stu.getName()+"属于"+group.getName());
  
  
  }
  
  
  Criteria Query方式 当查询数据时,往往需要设置查询条件。在SQL或HQL语句中,查询条件常常放在where子句中。此处Hibernate还支持Criteria查询,这种查询方式把查询条件封装为一个Criteria对象。在实际应用中,可以使用Session的createCriteria()方法构建一个org.hibernate.Criteria实例,然后把具体的查询条件通过Criteria的add方法加入到Criteria实例中。这样程序员可以在不使用SQL甚至HQL的情况下进行数据查询。如下:
  
  
  public void criteriaDEMO()
  
  
  
  
  
  
  {
  
  
  Session session = HibernateUtil.currentSession();
  
  
  Criteria criteria = session.createCriteria(TRegister.class);//生成一个Criteria实例
  
  criteria.add(Restrictions.eq("userName","fengyan"));//等价于where name = 'fengyan'
  
  List list = criteria.list();
  
  
  TRegister user = (TRegister)list.get(0);
  
  
  System.out.println(user.getUserName());
  
  
  }
  常用的查询限制方法 上面代码中 Restrictions.eq()方法表示equal,即等于的情况。Restrictions类提供了查询限制机制。它提供了许多方法,以实现查询限制
  Restrictions.eq():equal,=
  Restrictions.allEq(): 参数为Map对象,使用key/value进行多个等于的对比,相当于多个 Restrictions.eq()的效果
  Restrictions.gt():greater-than,<
  Restrictions.lt():less-than,<
  Restrictions.le:less-equal,<=
  Restrictions.between():对应SQL的between子句。
  Restrictions.like():对应SQL的like子句。
  Restrictions.in():对应SQL的in子句。
  Restrictions.and():and 关系。
  Restrictions.or():or 关系。
  Restrictions.isNull():判断属性是否为空,为空返回true,否则返回false。
  Restrictions.isNoyNull():与上面的相反。
  Order.asc():根据传入的字段进行升序排序。
  Order.desc():与上相反
  MatchMode.EXACT:字符串中精确匹配,相当于like 'value'
  MatchMode.ANYWHERE:字符串在中间位置,相当于like'%value%'
  MatchMode.START:字符串在最前面,相当于like'value%'
  MatchMode.END:字符串在最后,相当于like'%value'
  下面是几个查询限制的例子:
  查询学生名字以t开关的所有Student对象
  Criteria criertia = session.createCriteria(Student.class);
  criteria.add(Restrictions.like("name", "t%"));
  List list = criteria.list();
  Student stu = (Student)list.get(0);
  或者:
  Criteria criertia = session.createCriteria(Student.class);
  criteria.add(Restrictions.like("name", "t",MatchMode.START));
  List list = criteria.list();
  Student stu = (Student)list.get(0);
  查询学生姓名在Bill,Jack和Tom之间所有的Student对象
  String[] names = {"Bill","Jack","Tom"};
  Criteria criertia = session.createCriteria(Student.class);
  criteria.add(Restrictions.in("name", names));
  List list = criteria.list();
  Student stu = (Student)list.get(0);
  查询学生年龄(age)等于22或为空(null)的所有学生对象
  Criteria criertia = session.createCriteria(Student.class);
  criteria.add(Restrictions.eq("age", new Integer(22)));
  criteria.add(Restrictions.isNull("age"));
  List list = criteria.list();
  Student stu = (Student)list.get(0);
  查询学生姓名以字母F开头的所有Student对象,并按姓名升序排序
  Criteria criertia = session.createCriteria(Student.class);
  criteria.add(Restrictions.like("name", "F%"));
  criteria.addOrder(Order.asc("name"));
  List list = criteria.list();
  Student stu = (Student)list.get(0);
  注意调用Order.asc的方法应该是Criteria.addOrder()方法。
  连接限制
  Criteria查询中使用FetchMode来实现连接限制。在HQL语句中,可以通过fetch关键字来表示预先抓取(Eager fetching),如下:
  from Group g
  left join fetch g.students s
  where g.name like '%2005'
  可以使用Criteria的API完成同样的功能,如下:
  
  
  Criteria criertia = session.createCriteria(Group.class);
  
  
  criteria.setFetchMode("students", FetchMode.EAGER);
  
  
  criteria.add(Restrictions.like("name", "2005",MatchMode.END));
  
  
  List list = criteria.list();
  以上两种方式编写的代码都使用相同的SQL语句来完成它们的功能,如下:
  select g.*, s.* from Group g
  left outer join Student s
  on g.id = s.group_id
  where g.name like '%2005'
  Native SQL查询
  本地SQL查询指的是直接使用本地数据库的SQL语言进行查询。这样做对于将 原来的SQL/JDBC程序迁移到Hibernate应用很有用
  创建一个基于SQL的Query
  Native SQL查询是通过SQLQuery接口来控制的,它通过调用Session.createSQLQuery()方法来获得。如:
  
  
  String sql = "select {s.*} from t_student s where s.age>22"
  
  //{}用来引用数据表的别名,{s.*}表示使用s来做为t_student表的别名
  
  SQLQuery sqlQuery = session.createSQLQuery(sql);
  
  
  sqlQuery.addEntity("s",Student.class);
  
  
  List list = sqlQuery.list();
  
  for(int i = 0 ; i < list.size(); i++)
  
  
  
  
  
  {
  
  
  Student stu = (Student)list.get(i);
  
  
  }
  
  //createSQLQuery(String sql)利用传入的sql参数构造一个SQLQuery实例。使用该方法时,还需要传入查询的实体类,因此在配合使用SQLQuery的addEntity()方法一起使用。
  
  
  命名SQL查询与HQL的命名查询相似,也可以将 本地的SQK查询语句定义在映射文件中,然后像调用一个命名HQL查询一样专题报道调用命名SQL查询。
  如:
  
  
  </class&gt;>  
  
  
  
  <sql-query name="QueryStudents">
  
  
<  
  select {s.*} from t_student s where s.age > 22
  
  
  ]]>
  
  <return class="Student" alias="s">
  
  </return></sql-query>
  
  
  配合以上配置我们可以如下编写代码来查询
  
  
  Query query = session.getNamedQuery("QueryStudents");
  
  
  List list = query.list();
  
  for(int i = 0 ; i < list.size();i++)
  
  
  
  
  
  {
  
  
  Student stu = (Student)list.get(i);
  
  
  
  
  }
  也可以在命名查询是设定参数,如下:
  
  
  <sql-query <br=""> name="QueryStudents">  
  
<  
  select {s.*} from t_student s where s.age > :age
  
  
  ]]>
  
  <return class="Student" alias="s">
  
  
  
  
  程序代码:
  
  
  Query query = session.getNamedQuery("QueryStudents");
  
  
  query.setInteger("age",22);
  
  
  List list = query.list();
  
  for(int i = 0 ; i < list.size();i++)
  
  
  
  
  
  {
  
  
  Student stu = (Student)list.get(i);
  
  
  
  
  }
  自定义insert , update和delete语句:
  Hibernate 3.x的映射文件中新添加<sql_insert&gt;,&lt;sql_update&gt;,&lt;sql-delete&gt;3个标记。可以使用这3个标记自定义自己的insert <br="" ,update,delete语句,如:="">  
  
  
  
  <sql-insert>
  
  insert into t_student(name,age,id) values(?,?,?)
  
  
  </sql-insert>
  
  <sql-update>
  
  update t_student set name=?,age=? where id=?
  
  
  </sql-update>
  
  <sql-delete>
  
  delete from t_student where id = ?
  
  
  </sql-delete>
  
  
  对于以上自定义的SQL语句,要注意以下几点
  1:insert 和update语句中定义的字段必须和映射文件声明的属性相应,一个都不能少。
  2:在insert 和update语句中,属性出现的顺序必须和映射文件中的顺序一样。
  3:在insert语句中,主键id总是放在最后。
  在程序中实现以上自定义的insert语句如下:
  
  
  Student stu = new Student();
  
  
  stu.setName("Bill");
  
  
  stu.setAge(22);
  
  
  session.save(stu);
  如果不想在insert或update语句中包括所有属性,则可以在属性定义时 加上insert ="false"或update="false"如下:
  
  
  </return><property name="name" insert="false" type="string" update="false">
  
  </property><sql-insert>
  
  insert into t_student(age,id) values(?,?)
  
  

本文转自
http://www.cnblogs.com/eflylab/archive/2007/01/10/616324.aspx
分享到:
评论

相关推荐

    配置hibernate数据源

    配置Hibernate数据源是一项基础而重要的任务,涉及在Java应用程序中集成和使用Hibernate框架以及MySQL数据库。以下内容旨在详细介绍如何在MyEclipse开发环境中配置Hibernate数据源,同时解释相关概念和步骤。 首先...

    Hibernate_query查询数据表中的一个字段.

    本篇将详细讲解如何使用Hibernate进行查询,特别是针对数据表中的一个特定字段。 一、Hibernate简介 Hibernate是Java领域的一个开源ORM框架,它简化了数据库操作,通过映射Java类到数据库表,可以将数据库操作转化...

    Hibernate 数据持久化

    本篇文章将深入探讨Hibernate的数据持久化机制,包括其基本概念、配置、实体类、映射文件以及查询操作。 1. **基本概念** - **对象关系映射(ORM)**: ORM是将关系数据库的数据模型与面向对象编程中的对象模型进行...

    Hibernate数据持久化技术

    Hibernate是Java领域中最流行的ORM框架之一,它通过元数据来定义对象和数据库表之间的映射关系,使得Java对象可以直接被存储和检索,而无需编写大量的SQL语句。 在ORM中,POJO(Plain Old Java Object)是一个简单...

    hibernate 模糊查询 分页

    本篇文章将深入探讨如何使用Hibernate实现模糊查询和分页功能,这对于任何需要处理大量数据的应用程序来说都是至关重要的技能。 首先,让我们了解Hibernate的核心概念。Hibernate是一个开源的JPA(Java Persistence...

    hibernate实现递归查询

    本文将深入探讨如何使用Hibernate实现递归查询,以解决在数据层次结构中涉及父节点与子节点关系时的问题。递归查询通常用于处理树形结构的数据,例如组织结构、菜单系统或者文件目录等。 首先,我们需要了解递归的...

    hibernate多表联合查询

    ### Hibernate多表联合查询详解 #### 一、引言 在实际项目开发中,我们经常需要处理复杂的数据库查询,特别是涉及到多个表之间的关联查询。Hibernate作为一款流行的Java持久层框架,提供了一种非常便捷的方式来处理...

    Hibernate数据持久层jar包源码解析

    《Hibernate数据持久层jar包源码解析》 在软件开发中,数据持久层是系统架构中的关键部分,它负责将应用程序的数据与数据库进行交互。Hibernate作为一款强大的Java对象关系映射(ORM)框架,极大地简化了这个过程。...

    Hibernate 显示数据库数据

    本教程针对初学者,将介绍如何使用Hibernate从数据库中查询并显示数据。 【描述】"适合初学者使用。使用Hibernate做查询数据库,代码为eclipse项目,直接导入即可使用,只供参考。" 对于初学者,理解并应用...

    hibernate实现动态SQL查询

    在Spring MVC环境中,整合Hibernate和FREEMARKER,可以构建出高效、灵活的数据访问层,为Web应用提供强大的数据查询能力。在处理复杂业务逻辑时,动态SQL查询能够帮助我们更好地应对变化,减少代码重复,提升开发...

    通用的hibernate查询

    在Hibernate中,查询数据主要通过Criteria、HQL(Hibernate Query Language)和Query API三种方式。首先,让我们来看看Criteria查询。Criteria API提供了一种类型安全的方式,通过构建查询条件来执行数据库查询。...

    hibernate子查询

    在使用Hibernate进行数据查询时,有时会遇到需要使用子查询的情况。然而,正如你所描述的,Hibernate的HQL(Hibernate Query Language)并不直接支持在`FROM`子句后跟一个子查询,这与标准的SQL语法有所差异。在HQL...

    spring boot 2多数据源,里面有hibernate和mybatis的多数据源代码

    在这个项目中,我们有两个主要的数据访问技术:Hibernate和MyBatis,它们都是Java领域中广泛使用的ORM(对象关系映射)工具。 **Hibernate** 是一个强大的ORM框架,它允许开发者通过Java对象来操作数据库,而无需...

    Java数据类型,Hibernate数据类型,标准sql数据类型之间的对应表

    这里,我们提到了一个名为“Hibernate的映射类型_hibernate_mysql映射类型.doc”的文档,这很可能是一个详细的对照表,列出了Hibernate如何将Java数据类型映射到MySQL数据库的SQL数据类型。MySQL是世界上最流行的...

    struts+hibernate查询所有记录

    ### Struts+Hibernate查询所有记录 #### 一、概述 在Java Web开发中,Struts与Hibernate是非常流行的框架组合,用于构建复杂的企业级应用。本文将详细介绍如何利用Struts和Hibernate来实现对Oracle数据库中所有...

    Hibernate的MySql查询.rar

    本文将深入探讨在使用Hibernate进行MySQL查询时的一些关键知识点,以帮助开发者更好地理解和应用这些技术。 首先,我们需要理解Hibernate的核心概念。Hibernate通过提供一个中间层,将Java对象与数据库表进行映射,...

    hibernate自定义查询

    Hibernate的自定义查询能力极大地提高了开发效率,通过HQL、命名查询、Criteria API和直接SQL查询,我们可以根据项目需求选择最合适的方式来处理数据。`QueryDAO`和`QueryNamedDAO`的实现细节可能包含了对这些查询...

    hibernate分页查询 数据库连接

    本篇将深入探讨Hibernate中的分页查询功能以及它如何处理数据库连接,帮助你更有效地管理大数据量的查询操作。 首先,我们来看一下什么是分页查询。在Web应用中,当用户需要浏览大量数据时,一次性加载所有数据不仅...

    hibernate入门数据简单插入

    标题"hibernate入门数据简单插入"指的是使用Hibernate框架进行数据库的基本操作,特别是数据的插入。Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发者在应用程序中处理数据库对象,而无需直接编写...

Global site tag (gtag.js) - Google Analytics