package com.leaves.daoUtil;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 此类用来创建hql查询语句,能自动生成如下格式hql语句。
* from BookInfo where bookNameId='null' and bookName='《三国演义》' and
* bookAuthor='施耐庵' ;
* 使用getHql()方法来创建hql语句,此方法调用会抛出异常。
* 此类需要你为其提供一个带有get和set方法的bean,类会根据其get的方法获得其值,如果get属性不为null则添加where条件。
* 如果没有设置任何方法,则默认生成from BookInfo形式HQL语句。
*
* @version 1.0.0.0
* @author leaves叶知泉,官方网站www.c5ms.com
*
*/
public class HqlModel {
private Object object;
/**
* 是否开启模糊查询
*/
private boolean likeSel;
public boolean isLikeSel() {
return likeSel;
}
/**
* 设置属性是否开启模糊查询
*
* @param likeSel
*/
public void setLikeSel(boolean likeSel) {
this.likeSel = likeSel;
}
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
/**
* 允许不带参数实例化
*/
private HqlModel() {
}
/**
* 使用指定的对象来获取一个HqlModel实例
*
* @param object
* 实例化时所需要的DTO对象
*/
public static HqlModel newInstanceByObj(Object object) {
HqlModel hqlModel = new HqlModel();
hqlModel.setObject(object);
return hqlModel;
}
/**
* 用来进行创建hql语句的方法, 此方法可能抛出异常
*
* @return 根据传入对象的get方法构建的hql语句
*/
public String getHql() throws Exception {
// 预准备好的hql语句。
StringBuffer sbf = new StringBuffer("from Object where ");
// 得道给定实例的类型。
Class> theClass = this.getObject().getClass();
// 使用类名替换Object字符串。
sbf.replace(5, 11, theClass.getSimpleName());
// 活的该类所有属性。
Field[] fields = object.getClass().getDeclaredFields();
// 遍历所有属性
for (Field field : fields) {
PropertyDescriptor pd = new PropertyDescriptor(field.getName(),
theClass);
// 获得所有属性的读取方法
Method getMethod = pd.getReadMethod();
// 执行读取方法,获得属性值
Object objTemp = getMethod.invoke(object);
// 如果属性值为null,就略过
if (objTemp == null) {
continue;
}
// 如果不为空。
// 判断是否开启模糊查询,添加查询条件,并且加上%%符号。
if (isLikeSel()) {
sbf.append(field.getName() + " like '%" + objTemp + "%'");
sbf.append(" and ");
}//同理添加查询条件,不添加%%符号。
else {
sbf.append(field.getName() + "='" + objTemp + "'");
sbf.append(" and ");
}
}
//最后一个属性设置完成之后取出残余的and和尾部的空格。
if (sbf.toString().endsWith("and ")) {
sbf.delete(sbf.length() - "and".length() - 1, sbf.length());
}
//如果没有设置任何属性,则取出尾部的where字符串和后面的空格。
if (sbf.toString().endsWith("where ")) {
sbf.delete(sbf.length() - "where".length() - 1, sbf.length());
}
//返回生成好的语句。
return sbf.toString();
}
}
目前属于1.0版本,还不支持sql语句生成,其实都是一个道理,只要在类中修改 StringBuffer sbf = new StringBuffer(“from Object where ”);这一句就能完成。
希望朋友们修改出更好的生成器之后能跟小弟一起分享,多多指教。
此类不足之处:
·没有sql、hql切换的开关
·理论上还可以生成update和save这样的语句,只是小弟还没有想到设计。
分享到:
2011-11-10 00:42
浏览 3895
论坛回复 / 浏览 (19 / 8323)
评论
1 楼
980109763
2013-03-05
[i][i][i][i]sdfdsfsdfds
[/i][/i][/i][/i]