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 功能不够强大的地方。
我想优化 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 功能不够强大的地方。