模糊查询的hql语句_java利用反射机制完成所有hibernate的模糊、非模糊查询。可以按条件查询...

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这样的语句,只是小弟还没有想到设计。

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2011-11-10 00:42

浏览 3895

论坛回复 / 浏览 (19 / 8323)

评论

1 楼

980109763

2013-03-05

[i][i][i][i]sdfdsfsdfds

f7d8ef7923727bd737bc38b1569bbd07.gif 

f7d8ef7923727bd737bc38b1569bbd07.gif 

f7d8ef7923727bd737bc38b1569bbd07.gif 

f7d8ef7923727bd737bc38b1569bbd07.gif 

f7d8ef7923727bd737bc38b1569bbd07.gif 

f7d8ef7923727bd737bc38b1569bbd07.gif[/i][/i][/i][/i]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值