根据对象动态构造hibernate hql查询语句

目录

背景:在hibernate 应用中,需要实现按条件删除功能

场景:在方法中传入泛型对象,构建HQL语句

思路:遍历对象属性,如果有值,表明该字段是删除条件,用它构建删除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);
        });
    }
}

结果

🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌---🐌

👨‍🌾本文结束,希望有帮到阁下。更多问题可以到我博客来搜索
👉【点击搜索
👉【进入博客
如果觉得不错,欢迎关注点赞🙏
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cy谭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值