JFinal 关联查询 renderJson 嵌套结构
findFirst("select p.*,pu.name postUserName,pu.level postUserLevel from post p left join user pu on p.postUserId=pu.id where p.id=?",1)
返回的层级都在一层,不是面向对象的结构
{ "title":"开源中国红薯最帅", "content":"众所周知,比红薯帅的人都...", "createTime":"2016-12-17 13:15:00", "commentNum":9999, "postUserId":"lfkdhah823472", "postUserName":"开源小编", "postUserLevel":-1 }
实际上我想要的返回是这样
{ "title":"开源中国红薯最帅", "content":"众所周知,比红薯帅的人都...", "createTime":"2016-12-17 13:15:00", "commentNum":9999, "postUserId":"lfkdhah823472", "postUser":{ "id":"lfkdhah823472", "name":"开源小编", "level":-1 } }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(12)
我也想这样,但是感觉太多手动调用了。另外帖子列表里都用缓存会不会缓存使用很大
新增加的Bean生成能改善这个问题吗?
回复
@啦啦啦拉拉 : jfinal 自 2.2 以来就有了 bean,不存在新增加这一说,缓存看你怎么做,不是缓存整个 list,而是对 user 这张表进行 id ---> user 的缓存,在 getUser() 时利用 id 去缓存获取 user
jfinal 手册里面有例子,只需要在 Post 这个类中添加一个 getUser() 方法,然后在这个方法中直接 find("select * from user where id=?", getId()) 即可
然后在后面 json 的时候这样:FastJson.getJson().toJson(post),或者 Jackson.getJson().toJson(post),这两个 json 转换工具默认是根据 getter 方法去转换,所以会调用你上面创建的 getUser() 方法,并进行进一步的转换
在大并发情况下,getUser() 里面是利用 cache join的方式去内存中找数据,不用读库,速度极快,jfinal 社区对于用户表的处理就是这样
太惨了,不知道新版的JFinal增加的Bean能不能处理这个问题
是不是只能拼啊
已经被客户端那边的同事吐槽很久了,扁平的结构可读性很差,我这边也是只能每个查询手动去set
回复
@啦啦啦拉拉 : 童鞋,推荐你业余去学习下mybatis,这会让你尝到新东西。
回复
@web4j : 其实你做单表查询,然后postUser对应的就是User,然后User的查询可以这样搞:User.findById(strId),User加个缓存,然后关联查询不要了,在你的Java里面循环处理查询的resultList,把User放进去。
回复
@web4j : 这是一个建议。
回复
@web4j : mybatis 才是老东西好不好,每个字段都要手写,太原始了。
findFirst 返回的是Model或者Record,本质就是一个扁平的Map。
你这个SQL返回的值都是同一个层次的,所以renderJson渲染的结果并没有错。
你如果要像你那样去处理,就需要自己转换成bean(或者用map嵌套实现)。
so, 简单的框架做简单的处理。