这两个星期以来,
我把原来用struts开发的一个测试工具改用struts+hibernate来实现,首先从心情上来,整个开发过程中始终保持愉快和平和,“原来开发可以这样愉快?”,再一点就是开发效率上高效了许多。
现在sun又加入jdocentral.com开始着手JDO2.0,想想看等它出台以后将是一个怎样激动人心得场面,让
我们拭目以待。
用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
*/