请教关于model中使用dao.find返回值的问题

//假设user表只存在uname和pwd,通过脚本生成model之后,根据业务需求创建了一个视图view_user,其中会带有othercol
//此时如果使用如下方法
List<User> users = User.dao.find("select u.uname,u.pwd,u.othercol from view_user u ");
//这样获取到的List<User> users 中的每个user会存在othercol 属性?
//使用Db.batchSave(users ,users.size() ) 方法保存时 会报错
com.jfinal.plugin.activerecord.ActiveRecordException: com.microsoft.sqlserver.jdbc.SQLServerException: The index 9 is out of range.
    at com.jfinal.plugin.activerecord.DbPro.batch(DbPro.java:1149)
    at com.jfinal.plugin.activerecord.DbPro.batchSave(DbPro.java:1249)

请教各位朋友这样是正常的吗?如何将返回的user只保留model中的那些字段(即uname,pwd)?

评论区

杜福忠

2021-04-25 09:47

1:是根据sql的select来确定对象里面有什么属性,和model中的setget没有关系。这个是JF的特性,一般用于连表查询,字段就会多出来的。所以是正常的。
2:返回的user只保留model中的那些字段,这个model中有方法的:
keep(String attr) //保留
keep(String... attrs)//保留多个
remove(String attr)//移出不要的
remove(String... attrs)//移出多个不要的
List需要遍历处理。可自建一个小工具类,进行批量处理。
3:batchSave时报错,这个是业务代码中有错误用法了,batchSave前肯定操作了model,
对本次返回的model操作时不能全部用set,因为你这里有部分字段并非user表的,
需要使用setOrPut(String attrOrNot, Object value),这个里面会自动判断是否需要写库。同时要注意batchSave会取第一条的set过的字段作为拼接SQL的字段,所以本次list中的model都需要是同样字段的操作,不然执行结果并非你想象的样子。

HingLo

2021-04-25 17:09

你就不要用Model 查询了,直接Db.find(),然后用record对象接收

124653847atqq.com

2021-04-26 08:26

@杜福忠 @HingLo 了然了 。多谢各位!