Hibernate查询解决方案
### Hibernate查询解决方案详解 #### 一、概述 Hibernate 是一个开放源代码的 ORM(对象关系映射)框架,它提供了从 Java 类到数据库表的映射机制,以及数据的查询和获取方式。Hibernate 的核心功能之一是提供了一套强大的查询接口和方法,包括基于对象的查询、SQL 查询和 HQL (Hibernate Query Language) 查询等。本文将详细介绍 Hibernate 提供的几种查询方式及其应用场景。 #### 二、重要知识点 ##### 1. Session 对象与查询操作 在 Hibernate 中,所有持久化操作都需要通过 Session 对象来完成,包括查询操作。Session 对象提供了多种查询方法,如 `load`、`get`、`createQuery` 和 `find` 等。 - **`load` 方法**:用于根据主键加载对象。如果找不到对应的记录,将会抛出 `org.hibernate.ObjectNotFoundException` 异常。 - `load(Class<T> theClass, Serializable id)`:根据类类型和主键加载对象。 - `load(Class<T> theClass, Serializable id, LockMode lockMode)`:根据类类型、主键和锁定模式加载对象。 - `load(Object object, Serializable id)`:根据对象和主键加载对象。 - **`createQuery` 方法**:用于执行 HQL 或 SQL 查询。 - `createQuery(String hql)`:创建一个 HQL 查询。 - 示例: ```java Query query = session.createQuery("from User as user"); ``` - 参数设置: - 使用 `?` 作为占位符: ```java Query query = session.createQuery("from User as user where user.name=?"); query.setString(0, name); ``` - 使用命名参数 `:`: ```java Query query = session.createQuery("from User as user where user.name=:name"); query.setParameter("name", name); ``` - **`find` 方法**:用于执行简单的 HQL 查询。 - `find(String hql)`:执行简单的 HQL 查询。 - `find(String hql, Object[] values, Type[] types)`:执行带有参数的 HQL 查询。 - 示例: ```java List<User> list = session.find("from User as user where user.name=?", name, Hibernate.STRING); ``` ##### 2. HQL 查询详解 HQL(Hibernate Query Language)是一种面向对象的查询语言,类似于 SQL 但更加面向对象。 - **基本语法**: ```java Query query = session.createQuery("from ClassName as alias"); ``` - **条件查询**: ```java Query query = session.createQuery("from User as user where user.name=? and user.pw=?"); query.setString(0, name); query.setString(1, pw); ``` - **分页查询**: ```java Query query = session.createQuery("from User as user"); query.setFirstResult(0); // 设置起始位置 query.setMaxResults(10); // 设置每页显示数量 ``` - **排序查询**: ```java Query query = session.createQuery("from User as user order by user.name desc"); ``` - **聚合函数**: ```java Query query = session.createQuery("select count(*) from User as user"); ``` ##### 3. 高级查询技巧 - **使用自定义参数类**:可以使用自定义的参数类来传递查询参数,例如上面提到的 `Paras` 类。 ```java public class Paras { private Object pName; private int typeNo; public Object getPName() { return pName; } public void setPName(Object pName) { this.pName = pName; } public int getTypeNo() { return typeNo; } public void setTypeNo(int typeNo) { this.typeNo = typeNo; } } ``` 这种方式可以在复杂查询时提供更好的封装性和可读性。 - **动态构建查询**:在实际开发中,经常需要根据不同的条件动态构建查询语句。可以通过字符串拼接或者使用 Criteria API 实现。 ```java Criteria criteria = session.createCriteria(User.class); if (name != null && !name.isEmpty()) { criteria.add(Restrictions.eq("name", name)); } ``` - **SQL 查询**:Hibernate 也支持原生 SQL 查询,可以通过 `createSQLQuery` 方法实现。 ```java SQLQuery query = session.createSQLQuery("SELECT * FROM user WHERE name = ?"); query.setString(0, name); ``` #### 三、总结 本文详细介绍了 Hibernate 提供的各种查询方式,包括 `load`、`get`、`createQuery` 和 `find` 等方法,并重点阐述了 HQL 查询的基本用法和高级技巧。通过本文的学习,读者可以掌握 Hibernate 的基本查询操作,并能根据不同场景选择合适的查询方法。在实际项目开发中,合理运用 Hibernate 查询功能,可以有效提高数据访问效率和程序的可维护性。
用Hibernate来操纵持久数据非常简单,在这里一些简单的查询我会一笔带过,本文着重说明在综合查询兼有分页的时候我的一些经验,如果网友觉得我的方案还有不足的地方,也请和我讨论
第一部分:Hibernate提供的查询接口或其方法(此部分不做深究,请参考hibernate手册)
1。根据ID查询
要用到Session接口的load方法。
load(Class theClass, Serializable id)
load(Class theClass, Serializable id, LockMode lockMode)
load(Object object, Serializable id)
2。HQL语句进行查询
2。1 利用Query接口,Query由Session里的createQuery()来产生一个查询
1)不带参数的查询(这类比较简单)
Query query=session.createQuery("select user from User as user");
2)带参数的查询
Query query=session.createQuery("select user from User as user where user.name=?");
query.setString(0,name)//假设name为传过来的参数
Query query=session.createQuery("select user from User as user where user.name=:name");
query.setString("name",name)//假设name为传过来的参数
(多个参数以此类推)
利用Session接口的find查询
find(String query)
find(String query, Object[] values, Type[] types)
find(String query, Object value, Type type) 均返回list
如:
List list=session.find("select user from Users as user where user.name=?",name,Hibernate.STRING)
{推荐使用Query的方法进行查询}
第二部分:hibernate综合查询解决方案 (此部分详细实例说明,如有不足的地方请写信给我)
大家从第一部分可以看到,带有参数的查询,必须使用到Query接口,如上边:
Query query=session.createQuery("select users from Users as users where users.name=?");
query.setString(0,name)//假设name为传过来的参数
但是在系统中如何才能写一个公用的查寻方法呢?咋一看,似乎是不可以的,因为每一次查询的参数不一样,参数的数量不一样(如下代码),那么我们如何提取共性呢?
Query query=session.createQuery("select users from Users as users where users.name=? and users.pw=?");
query.setString(0,name)//假设name为传过来的参数
query.setString(1,pw);
首先说明,我的解决方案是从Seesion接口的find方法找到出口的,如下为Session接口得find()方法之一:
find(String query, Object[] values, Type[] types)
其中Object[]为存放参数值的数组,Type[]为存放参数类型的数组,他们的顺序是和query里“?” 的顺序是相同的。那么我为什么不用该find方法呢,因为如果有分页的情况,那么该方法将不适用。
下面详细要说明的解决方案:
首先我想创建三个新的对象:Paras.java(参数对象) ParasList.java(参数集合对象)HQuery.java
(感谢我的同事camel提供注释良好的代码)
1。Paras.java(参数对象)
package com.ifreeway.homegrown.testing.waf;
/**
*
* <p>Title:定义一个sql语句的条件参数类 </p>
* <p>Description: 可以使用有序的参数集合传送给sql/hql语句 </p>
* <p>Copyright: Copyright (c) 2003</p>
剩余12页未读,继续阅读
- 粉丝: 1
- 资源: 5
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助