【发布时间】:2018-11-05 01:58:10
【问题描述】:
我想优化一个 queryDSL + Spring 数据查询。目前我使用 BooleanBuilder 作为谓词,这很好,但它加入了太多的表。我不需要表格中的所有列,也不需要某些表格。我相信使用投影会减少加入的表的数量。
我尝试使用 Projections.bean() 以及扩展 MappingProjection,但这两种方法都导致不使用连接,而是从多个表中进行选择,这会导致行数少于所需行数。
我的数据结构由一个 Booking 实体和一些相关实体(如 User)组成,因此看起来如下所示:
@Entity
public class Booking {
@ManyToOne
@JoinColumn(name = "userId", nullable = false)
private User endUser;
}
@Entity
public class User {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "endUser", fetch = FetchType.LAZY)
private List<Booking> bookings;
}
我实现了一个自定义 queryDSL 投影存储库,如下所述:Spring Data JPA and Querydsl to fetch subset of columns using bean/constructor projection
我正在尝试如下投影:
Projections.bean(Booking.class,
booking.uuid,
Projections.bean(User.class,
booking.endUser.uuid
).as(booking.endUser.getMetadata().getName()
);
当前方案生成的sql如下所示:
select (...)
from booking booking0_,
user user12_
where booking0_.user_id=user12_.id
那么,如何让 QueryDSL 加入表而不是从所有表中进行选择? 我是否在尝试优化查询的正确道路上?投影有意义吗?
【问题讨论】:
-
您确定连接会比 where 子句快吗?见stackoverflow.com/questions/1129923/… 或stackoverflow.com/questions/2509987/…
-
@RyanDawson 感谢您的评论。我的 where 子句的问题不是速度,而是结果。他们错了:行数减少了。
-
谢谢,我明白了。
标签: spring-data spring-data-jpa querydsl