带连接的Spring数据jpa querydsl投影

时间:2018-05-25 16:02:52

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

我想优化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加入表而不是从所有表中选择? 我是否正在尝试优化查询?投影是否有意义?

1 个答案:

答案 0 :(得分:0)

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

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