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

转: Hibernate查询解决方案

    博客分类:
  • Java
阅读更多

作者  由88doc整理发布 转自: http://www.88doc.com/88doc/4491.html

简介:

用Hibernate来操纵持久数据非常简单,在这里一些简单的查询我会一笔带过,本文着重说明在综合查询兼有分页的时候我的一些经验,如果网友觉得我的方案还有不足的地方,也请和我讨论,我的email:plateau_t@sina.com.

第一部分: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)
List list=session.find("select user from Users as user where user.name=? and user.pw=?",new Object[]{name,pw},new Type[]{Hibernate.STRING,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>
* <p>Company: ifreeway</p>
* @author camel
* @version 1.0
*/

public class Paras {
/**
* 参数名称
*/
private Object pName;
/**
* 参数类型编码,于java.sql.types中的类型保持一致
*/
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;
}
}

2。ParasList.java(参数集合对象)
package com.ifreeway.homegrown.testing.waf;

import java.util.ArrayList;

/**
*
* <p>Title: 参数集合类</p>
* <p>Description: 封装sql/hql的参数到该集合类,便于处理和传递</p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: ifreeway</p>
* @author camel
* @version 1.0
*/

public class ParaList extends ArrayList {

/**
* 在指定位置添加一个参数对象
* @param index:参数的索引值
* @param p:需要加入的参数对象
*/
public void addParas(int index,Paras p){
super.add(index,p);
}

/**
* 在集合的最后位置添加一个参数对象
* @param p:需要加入的参数对象
*/
public void addParas(Paras p){
super.add(p);
}

/**
* 取得指定位置的参数对象
* @param index:参数的索引值
* @return:参数对象
*/
public Paras getParas(int index){
return (Paras)super.get(index) ;
}
/**
* 取得指定参数的索引
* @param p:参数对象
* @return:参数索引
*/
public int indexofParas(Paras p){
return super.indexOf(p) ;
}

/**
* 从集合中去掉一个指定的参数对象
* @param index:参数索引
*/
public void removeParas(int index){
super.remove(index) ;
}

}
3。HQuery.java
package com.ifreeway.homegrown.testing.waf;


/**
*
* <p>Title: HQL的语句封装类</p>
* <p>Description: 该对象封装HQL的查询语句,参数集合,排序参数,分组参数,单页起始地址 </p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company:ifreeway </p>
* @author camel
* @version 1.0
*/

public class HQuery {

/**
* HQL查询语句
*/
private String queryString;
/**
* 参数集合对象
*/
private ParaList paralist;
/**
* 排序字段
*/
private String orderby;
/**
* 分组字段
*/
private String groupby;
/**
* 分页起始查询地址
*/
private int pageStartNo;

/**
* 取得一个Hibernate的Query对象
* @return:Query对象
*/
public String getQueryString() {
return queryString;
}

/**
* 设置一个HQL查询字符串
* @param queryString:查询字符串
*
*/
public void setQueryString(String queryString) {

this.queryString =queryString;

}

/**
* 取得参数集合对象
* @return:参数集合对象
*/
public ParaList getParalist() {
return paralist;
}

/**
* 设置参数集合对象
* @param paralist:参数集合对象
*/
public void setParalist(ParaList paralist) {
this.paralist = paralist;
}

/**
* 取得排序字段
* @return:排序字段
*/
public String getOrderby() {
return orderby;
}

/**
* 设置排序字段
* @param orderby
*/
public void setOrderby(String orderby) {
this.orderby = orderby;
}

/**
* 取得分组字段
* @return
*/
public String getGroupby() {
return groupby;
}

/**
* 设置分组字段
* @param groupby
*/
public void setGroupby(String groupby) {
this.groupby = groupby;
}

/**
* 取得页起始地址
* @return
*/
public int getPageStartNo() {
return pageStartNo;
}

/**
* 设置页起始地址
* @param pageStartNo
*/
public void setPageStartNo(int pageStartNo) {
this.pageStartNo = pageStartNo;
}
}

上面三个对象的关系是:

用Paras来装载每一个查询参数
Paras paras=new Paras();
paras.setPName(...);
paras.setTypeNo(...);
然后放在ParasList中
ParasList paraslist=new ParasList();
paraslist.add(paras)
最后把填充以后的ParasList集合给HQuery
HQuery hquery=new HQuery();
hquery.setParalist(paraslist);

先面我们写一个公用查寻方法,来实现我们的综合查询:

/**
*
* 综合查询,首先实例化HQuery
* @see com.ifreeway.homegrown.testing.common.waf.DBHandler#find(com.ifreeway.homegrown.testing.common.waf.HQuery)
*/
public List find(HQuery _query) throws HibernateException {
List itr = null;
try {
StringBuffer query_str = new StringBuffer(_query.getQueryString());
//是否要排序
if (_query.getOrderby() != null) {
query_str.append(_query.getOrderby());
}
//是否要分组
if (_query.getGroupby() != null) {
query_str.append(_query.getGroupby());
}
Session session = getSession();
Query query = session.createQuery(query_str.toString());
if (_query.getParalist() != null) {
List list = _query.getParalist();
for (int i = 0; i < list.size(); i++) {
Paras param = (Paras) list.get(i);
switch (param.getTypeNo()) {//此处要根据参数类型的增加要增加相应的“case”
case Types.VARCHAR :
query.setString(i, param.getPName().toString());
break;
case Types.INTEGER :
query.setInteger(
i,
((Integer) param.getPName()).intValue());
break;
case Types.DATE :
query.setDate(i, (java.sql.Date) param.getPName());
break;
case Types.DOUBLE :
query.setDouble(
i,
((Double) param.getPName()).doubleValue());
break;
case Types.BOOLEAN :
query.setBoolean(
i,
((Boolean) param.getPName()).booleanValue());
break;
case Types.CHAR :
query.setCharacter(
i,
((Character) param.getPName()).charValue());
break;
case Types.JAVA_OBJECT :
query.setEntity(i, (BaseModel) param.getPName());
break;
}
}
}
//是否存在分页,当_query.getPageStartNo()==0是不分页
if (_query.getPageStartNo() != 0) {
int pageno = _query.getPageStartNo();
query.setFirstResult((pageno - 1) * Constants.RECORD_PER_PAGE);
query.setMaxResults((pageno) * Constants.RECORD_PER_PAGE);
}
itr = query.list();
closeSession();
} catch (Exception e) {

}
return itr;
}

好了一旦我们做好了上边的工作,查询对我们来说将是很容易的一件事情,而且可以达到公用,是不是省了许多力气?下面我将实例化一个例子来进一步说明:

例子:
HQuery hquery=HQuery();
hquery.setQueryString("select users from Users as users where users.name=? and users.sex=?");
hquery.setOrderby("order by users.age desc");

//如果要分页,把当前页curpage传递给hquery
hquery.setPageStartNo(curpage);

//实例化参数,本例为两个参数
Paras paras1=new Paras();
paras1.setPName(name);
paras1.setTypeNo(Types.VARCHAR);

Paras paras2=new Paras();
paras2.setPName(sex);
paras2.setTypeNo(Types.INTEGER);

ParasList paraslist=new ParasList();
paraslist.add(paras1);
paraslist.add(paras2);//注意顺序

hquery.setParalist(paraslist);

//好了,做好准备工作,调用查寻方法得到结果
List list=find(hquery);
 

分享到:
评论

相关推荐

    Hibernate查询解决方案

    ### Hibernate查询解决方案详解 #### 一、概述 Hibernate 是一个开放源代码的 ORM(对象关系映射)框架,它提供了从 Java 类到数据库表的映射机制,以及数据的查询和获取方式。Hibernate 的核心功能之一是提供了...

    hibernate-release-5.2.16.Final.zip

    这次我们关注的是Hibernate 5.2.16.Final版本,该版本包含了完整的jar包,包括日志处理库和MySQL数据库连接库,旨在为开发者提供一站式解决方案。 一、Hibernate框架核心概念 1. **对象关系映射(ORM)**:...

    很不错的Hibernate解决方案.pdf

    在此背景下,《很不错的Hibernate解决方案》一文介绍了一种基于Hibernate框架的物流系统持久层解决方案,旨在解决当前物流系统中存在的问题,并提升整体性能。 #### Hibernate框架简介 Hibernate是一种开放源代码的...

    hibernate错误解决方案

    ### Hibernate 错误解决方案 #### 一、概述 在使用Hibernate框架进行开发的过程中,经常会遇到各种各样的异常问题。这些问题可能会导致程序无法正常运行,甚至影响到系统的稳定性。本文将针对几个常见的Hibernate...

    weblogic10 与hibernate冲突解决方案 linux windows环境全解

    weblogic10 与hibernate冲突解决方案 错误如下:org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken linux windows 环境解决方案全解 Linux 启动脚本添加如下: export USER_...

    hibernate实现动态表查询的多种解决方案

    ### Hibernate 实现动态表查询的多种解决方案 #### 一、前言 在使用Hibernate进行数据库操作时,我们经常需要根据不同的需求对不同的表进行查询。特别是在处理多表、多库等复杂场景时,如何实现动态表查询就显得尤...

    图书:Hibernate入门 - 第二版

    8. **缓存机制**:探讨Hibernate的缓存策略,包括一级缓存和二级缓存,以及第三方缓存解决方案如EHCache和Memcached的集成。 9. **性能优化**:提供实用技巧和最佳实践,帮助开发者提升Hibernate应用的性能,如...

    org.hibernate.HibernateException: No Hibernate Session bound to thread

    Hibernate Session 绑定线程解决方案 在 Java web 开发中, Hibernate 是一个非常流行的 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到关系数据库中。然而,在使用 Hibernate 进行数据库操作时,...

    hibernate-release-5.3.18.Final.tgz

    《Hibernate 5.3.18.Final:企业级持久化框架深度解析》 ...综上,Hibernate 5.3.18.Final版本为开发者提供了强大而稳定的持久化解决方案,通过深入理解和熟练运用,可以有效提升Java应用的开发效率和质量。

    Hibernate入门到精通

    Hibernate 是一个开源的Java Persistence Framework,它提供了一种对象关系映射的解决方案,帮助开发者轻松地访问和操作关系数据库。Hibernate 的主要特点是:支持多种数据库管理系统、提供了高效的数据访问机制、...

    开源框架:Hibernate Gossip v1.04

    Hibernate 是“物件/关系对应”(Object/Relational Mapping)的解决方案,简写为ORM,简单的说就是将 Java 中的物件与物件关系,映射至关联式资料库中的表格与表格之间的关系, Hibernate 提供了这个过程中自动对应...

    spring学习:hibernate orm集成

    Spring和Hibernate是两个非常流行的Java开发框架,Spring提供了全面的企业级应用开发解决方案,而Hibernate则是Java领域中最著名的ORM框架之一。本文将详细介绍如何在Spring项目中集成Hibernate,实现高效的数据库...

    hibernate3必要jar包

    1. **Hibernate3简介**:Hibernate3是Hibernate项目的第三个主要版本,它提供了一种对象关系映射(ORM)解决方案,允许开发人员使用面向对象的编程模型来处理关系数据库。它的目标是减少数据库访问的复杂性,提高...

    hibernate4.3.11所需jar包

    总结来说,"hibernate4.3.11所需jar包"不仅包含Hibernate的核心库,还涉及到一系列依赖的第三方库,这些库共同构成了一个完整的ORM解决方案,使开发者能够高效地管理和操作数据库。在实际开发中,理解并熟练运用这些...

    hibernate常见错误解决方案

    ### Hibernate常见错误解决方案 在开发基于Hibernate框架的应用程序时,我们经常会遇到各种各样的异常情况。这些异常不仅会影响系统的正常运行,还可能增加调试难度。本文将针对几个常见的Hibernate异常进行详细...

    hibernate-memcached包

    **hibernate-memcached包** 是一个专为Hibernate框架设计的扩展,目的是将流行的分布式内存缓存系统Memcached整合到Hibernate中,作为其二级缓存解决方案。在大型分布式应用中,缓存技术是提高性能的关键,特别是...

    Hibernate3的依赖包

    ORM提供了数据持久化的解决方案,使得业务逻辑和数据存储之间保持松耦合。 2. **Session接口**:Hibernate的核心接口,用于与数据库进行交互。Session提供了事务管理、缓存管理和对象的保存、更新、查询等功能。 3...

    hibernate将本地SQL查询结果封装成对象(最终).zip

    Hibernate是一个开源的ORM框架,它为Java应用程序提供了数据持久化的解决方案。它通过映射Java类到数据库表,使得开发者可以避免编写大量的JDBC代码,而是以对象的方式操作数据。 2. Hibernate配置: 在使用...

    解决Hibernate对于Date类型的数据返回结果中时分秒不对的问题

    以上就是关于"解决Hibernate对于Date类型的数据返回结果中时分秒不对的问题"的详细分析和解决方案。在实际开发中,我们需要结合具体情况进行调整,确保日期时间数据的准确无误。对于提供的文件名"org",可能指的是...

Global site tag (gtag.js) - Google Analytics