NutzCN Logo
问答 SLOG 动态表名问题
发布于 2318天前 作者 Leewell1989 2318 次浏览 复制 上一个帖子 下一个帖子
标签:
/**
     * 重写父类方法
     * 获取特定月份的Dao实例
     * 修改为:以YlogBean建表
     *
     * @param key
     * @return
     */
    @Override
    public Dao dao(String key) {
        Dao dao = ymDaos.get(key);
        if (dao == null) {
            synchronized (this) {
                dao = ymDaos.get(key);
                if (dao == null) {
                    dao = Daos.ext(this.dao, key);
                    dao.create(YlogBean.class, false);
                    ymDaos.put(key, dao);
                }
            }
        }
        return dao;
    }

slog查询的时候,创建动态表名的地方拿到的总是当前月份的表名。
例如:以上代码,当 dao = Daos.ext(this.dao, key);这句代码中的this.dao中tablename为201807(insert时设的值),key为201806,方法返回的dao去执行query操作时,实际tablename还是201807.

9 回复

this.dao没有tableName的啊

它是这样的,第一次调这个方法的时候,this.dao是ioc注入进去的,当第二次再调这个方法的时候,this.dao是这样的:${Proxy65@11990}com.yuro.db.YuroDao@ea2160, 然后下边包含一个ExtDaoInvocationHandler的属性,这个属性下边有tableName

this.dao != dao, 你是不是看错了

应该是看不错,我截个图发你QQ可以吗?

你用nutzmore里面的代码吗? 什么版本?

对,1.r.65, 不过因为是oracle,所以稍微有所改动:https://nutz.cn/yvr/t/t621fk5qusgpcr0kphvuv404kj

那是最后修改的版本?

对,改了之后就没动过了,不过插件的版本应该是升级过的,当时可能用的是63, 其他地方生到65就一起升过来了

结贴:
写扩展时,需要用到动态表名的地方,要使用slogService.dao()/slogService.dao(key)来获取带动态表名的dao, 这里应注意,不要将返回值赋给this.dao,而是赋给一个临时变量,否则,使用动态表名时总是会获取到第一次的动态表名。
这是我的query扩展:

 public List<YlogBean> query(YlogBean log, int pageNum, int pageSize) {
        Criteria criteria = getCriteria(log);
        Pager pager = super.dao.createPager(pageNum, pageSize);
        String key = Dates.getFormateDate(log.getCreateTime(), "yyyyMM");
        Dao dao = dao(key);
        return dao.query(YlogBean.class, criteria, pager);
    }

    private Criteria getCriteria(YlogBean log) {
        Criteria criteria = Cnd.cri();
        if (Strings.isNotNull(log.getTag())) {
            criteria.where().andEquals("tg", log.getTag());
        }
        if (Strings.isNotNull(log.getUsername())) {
            criteria.where().andLike("u_name", log.getUsername());
        }
        if (log.getCreateTime() != null) {
            //ct
            criteria.where().and("to_char(ct, 'yyyy-mm-dd')", "=", Dates.getFormateDate(log.getCreateTime(), "yyyy-MM-dd"));
        }
        criteria.getOrderBy().desc("ct");
        return criteria;
    }


    public int count(YlogBean log) {
        Criteria criteria = getCriteria(log);
        String key = Dates.getFormateDate(log.getCreateTime(), "yyyyMM");
        Dao dao = dao(key);
        return dao.count(YlogBean.class, criteria);
    }
添加回复
请先登陆
回到顶部