一个关于dao.find(sql)和Db.query(sql)使用的问题

Jf3.5,最近学习使用jfinal,使用同样一个简单sql(select * from xxx)查询数据库,使用Db.query获得的List返回页面#for循环可以,使用dao.find(sql)获得的List返回页面异常:

exception.png

大致代码如下:

modle对象:

model.png

service层:

service_0.png

service.png


controller:

controller_0.png

controller.png

html:

html.png

使用dao.find(sql)异常,使用Db.query则不会异常,研究了半天,没理解到,希望各位大虾指点:

com.jfinal.template.TemplateException: Only the list array and map is supported by index access

Template: "/tpl/inspection/ac_inception_admin.html". Line: 42


debug跑时发现以下异常,使用dao.find(sql)时异常,但是异常又没有影响程序运行,不知道是否有影响:

service_dao_exception.png

dao_exception.png


评论区

iamdego

2019-06-12 15:49

看文档model那一章: 说当 select 后的字段有多个时,必须使用 不使用List 接收数据,例如:
List list = Db.query("select id, title, content from blog");
List list = Db.query("select * from blog");

为什么我使用List list = Db.query("select * from xxx");却能接到,难道只是规范问题?正在阅读文档和代码.

iamdego

2019-06-12 16:17

刚才试了一下,好像发现了问题,异常提示是:Only the list array and map is supported by index access
我前端取值时使用的是xxx[index]的方式,改成xxx.name这样的方式就可以了:
#for(incApply : inspectApplyList)

#(incApply.applicant_id)
#(incApply.applicant_name)
#(incApply.[0])

#end

JFinal

2019-06-12 22:32

其实异常信息已经很明确了,只有 List、数组、Map 才可以使用 index 表达式

所谓 index 表达式是指带有方扩号和下标的表达式,例如: map[123]、list[456]

而你的 incApply 是一个 model , 是决然不能使用 index 表达式的

至于 Db.query 方法,当 select 后方只有一个字段时返回 List 《Object》,当有多个字段时返回 List《Object[]》

Db.query 方法将原值返回数据不进行封装, 而 Db.find(...) 方法将返回值封装到 Record 对象中去

其实这些东东,单步调试看一下变量类型就全清楚了

了解 jfinal 最好的办法就是单步调试,看程序在动态中的行为与数据