NutzCN Logo
问答 DaoInterceptor 该怎么设置对象字段值
发布于 93天前 作者 chafferer 148 次浏览 复制 上一个帖子 下一个帖子
标签: dao

想在拦截器里面设置对象的updateTime, 下面的写法好像实现不了

DaoStatement st = chain.getDaoStatement();
		if (st instanceof NutPojo) {
			if (st.isUpdate()) {
				((NutPojo) st).addParamsBy(Chain.make("updateTime", new Date()));
			}
		}
		chain.doChain();
8 回复

已经被分解为sql的一部分

@wendal 那可以在哪里进行拦截赋值呢?

NutPojo就是一串sql元素,可以继续add语句的

@wendal
像下面这种sql,想在set 后面加属性的,该怎么下手

update set columnA = ‘123’ where id = 1

哦,这得从中间修改NutPojo的items属性, 不好做的样子

好吧,放弃

尝试做了一下,还是可以做到的

package org.nutz.dao.impl.interceptor;

import java.lang.reflect.Field;
import java.util.ArrayList;

import org.nutz.dao.DaoException;
import org.nutz.dao.DaoInterceptor;
import org.nutz.dao.DaoInterceptorChain;
import org.nutz.dao.impl.jdbc.NutPojo;
import org.nutz.dao.impl.sql.pojo.UpdateFieldsPItem;
import org.nutz.dao.sql.DaoStatement;
import org.nutz.dao.sql.PItem;
import org.nutz.dao.util.cri.Static;
import org.nutz.lang.Mirror;
import org.nutz.log.Log;
import org.nutz.log.Logs;

public class SayHiDaoInterceptor implements DaoInterceptor {
    
    private static final Log log = Logs.get();
    
    protected Field itemField;
    
    public SayHiDaoInterceptor() throws NoSuchFieldException, SecurityException {
        itemField = NutPojo.class.getDeclaredField("items");
        itemField.setAccessible(true);
    }
    
    @SuppressWarnings("unchecked")
    public void filter(DaoInterceptorChain chain) throws DaoException {
        log.debug("before >>> " + chain.getDaoStatement().toPreparedStatement());
        DaoStatement ds = chain.getDaoStatement();
        if (ds.isUpdate() && ds instanceof NutPojo) {
            NutPojo np = (NutPojo)ds;
            try {
                ArrayList<PItem> items = (ArrayList<PItem>) itemField.get(np);
                for (int i = 0; i < items.size(); i++) {
                    if (items.get(i) instanceof UpdateFieldsPItem) {
                        items.add(i+1, new Static(", updateTime=now()"));
                        break;
                    }
                }
            }
            catch (Throwable e) {
                e.printStackTrace();
            }
        }
        chain.doChain();
        log.debug("after  <<< " + chain.getDaoStatement().toPreparedStatement());
    }
}

大佬就是大佬,随便都能写出来,手动捂脸,赞!

添加回复
请先登陆
回到顶部