目录
思路:遍历对象属性,如果有值,表明该字段是删除条件,用它构建删除HQL。
背景:在hibernate 应用中,需要实现按条件删除功能
场景:在方法中传入泛型对象,构建HQL语句
思路:遍历对象属性,如果有值,表明该字段是删除条件,用它构建删除HQL。
具体做法是遍历对象对象的所有get方法,然后通过方法反射获取到对象的值。然后再判断值是否为空,从而组装HQL语句
核心类如下:(完整工程 github:https://github.com/zhan107876/method-invoke-demo)
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;
/**
* TestT
*
* @Author XZ.Tan
* @Date: 2021/1/9 10:04
* @Version 1.0
*/
@Slf4j
public class TestT<T> {
/**
* 创建删除HQL
*
* @param item
* @param paramList
* @return
*/
public String createDeleteHql(T item, List<Object> paramList) {
StringBuffer hqlBuffer = new StringBuffer();
hqlBuffer.append(" DELETE ");
hqlBuffer.append(item.getClass().getSimpleName());
hqlBuffer.append(" where 1 = 1");
// 获取类所有声明的字段,但但不包括继承的字段
Field[] declaredFields = item.getClass().getDeclaredFields();
// 遍历处理每个字段
for (Field field : declaredFields) {
try {
//获取字段名称
String name = field.getName();
// 获取java bean的标准命名字段的get set方法
PropertyDescriptor pd = new PropertyDescriptor(field.getName(), item.getClass());
//获得get方法
Method method = pd.getReadMethod();
// 反射调用获取方法值
Object value = getObjectMethodReturnValue(item, method);
// 业务处理:组装HQL语句
if (StringUtils.isNotEmpty(value.toString())) {
hqlBuffer.append(" AND " + name + "=? ");
paramList.add(value);
}
} catch (Exception e) {
// e.printStackTrace();
}
}
return hqlBuffer.toString();
}
/**
* 获取对象方法的返回值
*
* @param target
* @param method
* @return
*/
public static Object getObjectMethodReturnValue(Object target, Method method) {
if (method == null || target == null) {
return null;
}
Object value = null;
try {
value = method.invoke(target);
} catch (Exception e) {
return null;
}
return value;
}
}
测试
@slf4j
public class TestMain {
public static void main(String[] args) {
// 创建对象
TestT<TestBean> testT = new TestT();
TestBean testBean = new TestBean();
testBean.setName("zhan");
testBean.setCode("hhaa");
List<Object> paramList = new ArrayList<>();
// 测试获取
String deleteHql = testT.createDeleteHql(testBean, paramList);
// 打印结果
log.info("deleteHql=" + deleteHql);
paramList.forEach(v->{
log.info("param = " + v);
});
}
}
结果
🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌
👨🌾本文结束,希望有帮到阁下。更多问题可以到我博客来搜索
👉【点击搜索】
👉【进入博客】
如果觉得不错,欢迎关注点赞🙏