JFinal 关联查询 renderJson 嵌套结构

啦啦啦拉拉 发布于 2016/12/17 13:26
阅读 307
收藏 0
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
  }
}





加载中
0
红薯官方
红薯官方

findFirst 返回的是Model或者Record,本质就是一个扁平的Map。

你这个SQL返回的值都是同一个层次的,所以renderJson渲染的结果并没有错。

你如果要像你那样去处理,就需要自己转换成bean(或者用map嵌套实现)。

so, 简单的框架做简单的处理。

啦啦啦拉拉
啦啦啦拉拉
回复 @web4j : mybatis 才是老东西好不好,每个字段都要手写,太原始了。
红薯官方
红薯官方
回复 @web4j : 这是一个建议。
红薯官方
红薯官方
回复 @web4j : 其实你做单表查询,然后postUser对应的就是User,然后User的查询可以这样搞:User.findById(strId),User加个缓存,然后关联查询不要了,在你的Java里面循环处理查询的resultList,把User放进去。
红薯官方
红薯官方
回复 @啦啦啦拉拉 : 童鞋,推荐你业余去学习下mybatis,这会让你尝到新东西。
啦啦啦拉拉
啦啦啦拉拉
已经被客户端那边的同事吐槽很久了,扁平的结构可读性很差,我这边也是只能每个查询手动去set
0
杜福忠
杜福忠
  是不是只能拼啊
啦啦啦拉拉
啦啦啦拉拉
太惨了,不知道新版的JFinal增加的Bean能不能处理这个问题
0
JFinal
JFinal

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
JFinal
回复 @啦啦啦拉拉 : jfinal 自 2.2 以来就有了 bean,不存在新增加这一说,缓存看你怎么做,不是缓存整个 list,而是对 user 这张表进行 id ---> user 的缓存,在 getUser() 时利用 id 去缓存获取 user
啦啦啦拉拉
啦啦啦拉拉
新增加的Bean生成能改善这个问题吗?
啦啦啦拉拉
啦啦啦拉拉
我也想这样,但是感觉太多手动调用了。另外帖子列表里都用缓存会不会缓存使用很大
返回顶部
顶部