jfinal表关联操作的一些问题

对于多表查询有2个很重要的问题我想问下波总

1.在jfinal文档https://jfinal.com/doc/5-10 中有这么一个推荐写法

image.png

这样写应该是有问题的吧

User中有getBlogs,而在Blog中又有getUser,这样不会出现死循环吗?因为在解析这个model的时候通常会把getXXX去自动调用,这样就会产生user去找blog,因为blog中有user又会去找blog产生死循环?

然后我昨天去做了一个实验,我有一个营销的model

image.png

里面有课程,而课程里又会去找营销对象

image.png

我controller中去把课程返回给前端,果然产生了死循环

image.png

不能够这样互相嵌套的吧?

第2个问题也很重要

我现在有很多个课程,每个课程里都有自己的营销活动,如果我把数据查询写在model里,那么我查询100个课程他就会帮我产生100条查询营销活动的数据库连接,这样是不是太费性能了?如果我每一个model的多表查询都用这种方式去做的话,数据库性能开销我不敢想,jfinal正确的数据库多表查询的方案应该怎么弄?

我现在是用record的方式去做的,但是也很不方便,为什么?

因为record给我返回的是key是表的字段名,通常是带下划线的,

我需要一个个get key取出值来重新赋值到我的DTO的对象里返回回去

最后总结下我的问题:

  1. dao中getXXX 多model嵌套会死循环的吧,文档中那种推荐应该是有问题的?

  2. 即便我规避了嵌套的问题,model里直接getXXX去查询数据库,在多条查询记录的时候会产生很多次的数据库查询这样会很费数据库性能的吧?有无优化方法

  3. 我用record去查多表查询数据的时候返回record对象jfinal有没有自带的方法把record转成我的DTO也就是把下划线的驼峰后映射到我的DTO对象里,我现在是自己写了一个方法,我不知道Jfinal有没有更好的方式来处理这个问题

  4. 在jfinal中波总推荐的多表查询应该是怎么去写?

评论区

yjjdick1990

2022-11-28 15:32

@Jfinal 波总有空帮我看下问题

dkmilk

2022-11-28 16:26

一般不在MODEL中写方法,单独一个文件写吧。

yjjdick1990

2022-11-28 16:43

@dkmilk 所以文档里那种推荐的方法是不对的是吧?

dkmilk

2022-11-28 17:21

@yjjdick1990 不是不对,人家那个是一对多的一种实现方式,只是为了方便简单。实现方式有多种,你要选择一种你喜欢的,适合业务情况的。我个人觉得直接使用sql得到关联数据更有可读性,你的表述中我没看到你是一对多,你是两表关联,如果是一对多,子表数据过大,自然也不适合这么做,要根据实际情况灵活选择。

yjjdick1990

2022-11-28 17:30

@dkmilk 这个不是一对多的问题吧,这个是model互相嵌套会死循环啊,文档里的那种写法不会死循环吗?

dkmilk

2022-11-28 18:13

@yjjdick1990 人家那个是多提供了一个方法,根本没调用,你是写成了属生性,强行调用了,自然会出问题。

JFinal

2022-11-30 19:58

如果存在循环依赖调用,会有异常,一般不建议这么来用,而是让 model 仅作为承载数据的 bean

如果一定要这么来用,可以在查询代码之前,先判断一下数据是否已经存在,存在直接返回就不要再查询了

sliver

2022-12-01 09:18

StrKit中有toCamelCase转换下划线为驼峰, 也可以使用guava的CaseFormat

yjjdick1990

2022-12-02 16:39

@JFinal 好的谢谢波总解答

yjjdick1990

2022-12-02 16:40

@sliver 感谢回答

hhchor

2023-01-29 21:51

JAVA代码没有问题,返回给前端的时候转换成json才是问题所在!

转换成json的时候可以这样把User过滤掉:
@JSONField(serialize = false)
public User getUser()

热门反馈

扫码入社