nutz icon indicating copy to clipboard operation
nutz copied to clipboard

在Chain.from的时候能不能优先根据@column 注解来生成插入的信息

Open sillyfeng opened this issue 6 years ago • 16 comments

用的版本是1.r.54 , 我本身有一个pojo,由于业务逻辑的原因,有字段和数据库字段名字不一样,是有@column注解的,但是在用chain.from() 方法的时候,他好像不会关心@column注解,只是根据属性名来生成最后插入的sql。 个人觉得既然pojo中有这个@column注解了,感觉这个方法是可以优先根据这个来生成sql的。 或者有没有别的方法替代呢?或者有没有增加一个这么个方法的计划?

sillyfeng avatar Jan 01 '18 12:01 sillyfeng

先看看最新版的实现是怎样的?

wendal avatar Jan 01 '18 12:01 wendal

@wendal 刚刚测试了1.r.63 也是一样 方法是 nutDao.insert(String tabname, Chain.from(POJO)).

sillyfeng avatar Jan 01 '18 12:01 sillyfeng

@wendal 首先 先谢谢老铁,在大元旦还在回复我。。。

sillyfeng avatar Jan 01 '18 12:01 sillyfeng

新版有这个

public static Chain from(Object obj, FieldMatcher fm, Dao dao) {

wendal avatar Jan 01 '18 14:01 wendal

用上面这个方法测试的结果好像和之前的是一样的。(也是不会关心@column的注解。) 另外不知道1.r.6.0和之后的版本有什么差异,在我们项目进行热部署的时候,查出的list 会出现 class not cast 的情况。这个之后我再具体看一下原因。。

sillyfeng avatar Jan 02 '18 03:01 sillyfeng

热部署的话,可以把FastClass和Mirror Cache关掉

static {
NutConf.USE_FASTCLASS=false;
NutConf.USE_MIRROR_CACHE=false;
}

写到MainModule里面就行

wendal avatar Jan 02 '18 03:01 wendal

好的,谢谢!!!!,我暂时先把另外一个改一个pojo的属性名。。再次谢谢。。

sillyfeng avatar Jan 02 '18 03:01 sillyfeng

你的测试代码是怎样的? 我看了看代码, from给出的都是java属性名,这才是对的呢

在使用的时候,才会更新到数据库字段名, 额,你的场景是直接写表的名字,没有加Pojo类?

wendal avatar Jan 02 '18 03:01 wendal

我们开发是在终端,不方便拿出来,我大致描述一下。 Java 类 @Table("$tablename") public class *** { @Column("ywjgdm") String jgdm }

因为这个table名不是固定的。所以我插入的时候用的方法就是 nutDao.insert(String tabname, Chain from(Object obj, FieldMatcher fm, Dao dao)) 这个方法。 我想要的最后的结果就是(insert into tabname (ywjgdm) values(?) ),但是实际执行的时候 是(insert into tabname (jgdm) values(?))。

sillyfeng avatar Jan 02 '18 03:01 sillyfeng

insert的第一个参数改成obj.getClass()

wendal avatar Jan 02 '18 03:01 wendal

但是那个数据库的table名并没有在注解里写出来,这样是不是就找不到表了?是不是就必须要加那个TableName.set 才行。

sillyfeng avatar Jan 02 '18 03:01 sillyfeng

那你还写@Column ... , 话说加上@Table也无妨吧? 因为是动态的?

wendal avatar Jan 02 '18 03:01 wendal

嗯,3中数据状态,同样的结构,所以就有3个不同的表名,要根据不通的状态来修改这几个表里的数据。。表结构是一样的。我觉得是不是可以出一个这么个方法(就是chain的from 可以根据@column,或者@pk(用于查询))这样子,更灵活一点。。

sillyfeng avatar Jan 02 '18 03:01 sillyfeng

额, 这样子,我想想

wendal avatar Jan 02 '18 04:01 wendal

    public static Chain from(Object obj, FieldMatcher fm, Dao dao) {
        final Chain[] chains = new Chain[1];
        boolean re = Daos.filterFields(obj, fm, dao, new Callback2<MappingField, Object>() {
            public void invoke(MappingField mf, Object val) {
                if (mf.isReadonly() || !mf.isUpdate())
                    return;
                if (chains[0] == null)
                    chains[0] = Chain.make(mf.getColumnName(), val);
                else
                    chains[0].add(mf.getColumnName(), val);
            }
        });
        if (re)
            return chains[0];
        return null;
    }

wendal avatar Jan 02 '18 04:01 wendal

好的,我下午试试,吃饭先,,谢谢!!! 感谢!!

sillyfeng avatar Jan 02 '18 04:01 sillyfeng