Spring 带连接的数据 jpa querydsl 投影

Spring data jpa querydsl projection with joins

我想优化 queryDSL + Spring 数据查询。目前我正在使用 BooleanBuilder 作为谓词,这很好,但它连接了太多表。我不需要表中的所有列,而且我根本不需要某些表。我相信使用投影会减少连接的表数。

我尝试使用 Projections.bean() 以及扩展 MappingProjection,但这两种方法都会导致不使用连接而是从多个表中进行选择,这导致行数少于所需的行数。

我的数据结构由预订实体和一些相关实体(如用户)组成,如下所示:

@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 连接表而不是从所有表中进行选择? 我是否在尝试优化查询的正确路径上?投影有意义吗?

我最终创建了一个数据库视图,为其创建了一个实体,然后使用 querydsl 对其进行查询。这个真的简单明了,性能也不错。

这可能是 ORM 功能不够强大的地方。