JPQL构造函数传实体字段为何不会出现N+1问题?
为什么传递实体字段到DTO不会出现N+1查询问题
当你用
SELECT new Test(T) FROM Test T这种传入整个实体的写法时,JPA的执行逻辑是:- 先执行一次SQL查询,获取Test实体的主键信息(或实体代理对象);
- 因为要把实体传入DTO构造函数,JPA需要确保拿到完整的实体数据(保证实体处于托管状态),所以会触发第二次查询加载实体的所有字段数据,这就导致了两条查询日志。
而用
SELECT new Test(T.name, T.city) FROM Test T传入具体字段时:
JPA会直接把JPQL翻译成一条只查询name和city字段的SQL,数据库直接返回这两个字段的结果集,JPA拿到数据后直接调用DTO构造函数创建对象,完全不需要加载整个实体,所以只会产生一条查询,自然不会出现额外的查询(N+1问题本质就是额外的加载查询)。
内容的提问来源于stack exchange,提问作者user15361360
相关产品推荐
相关产品推荐

