【问题标题】:Spring data jpa querydsl projection with joins带有连接的 Spring 数据 jpa querydsl 投影
【发布时间】: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 加入表而不是从所有表中进行选择? 我是否在尝试优化查询的正确道路上?投影有意义吗?

【问题讨论】:

标签: spring-data spring-data-jpa querydsl


【解决方案1】:

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

这可能是 ORM 能力不足的地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-22
    • 2021-08-28
    • 2020-07-26
    • 2021-08-27
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 2021-06-01
    相关资源
    最近更新 更多