java - 如何在 join fetch QueryDSL JPAQuery 中选择?
问题描述
我有一个带有 QueryDSL JPAQuery 的应用程序。这里是:
JPAQuery<MyWrapper> searchQuery
= queryFactory.select(Projections.constructor(MyWrapper.class,
deviceGroup.id,
deviceGroup.name,
deviceGroup.orientation,
deviceGroup.location,
deviceGroup.customer,
workgroup.account,
Expressions.as(queryFactory.select(device.count())
.from(device)
.where(device.group.id.eq(deviceGroup.id)), "displaysQty"),
Expressions.as(queryFactory.select(device.count())
.from(device)
.where(device.group.id.eq(deviceGroup.id),
device.status.eq(DeviceStatus.HEALTHY)), "healthyQty"),
Expressions.as(queryFactory.select(device.count())
.from(device)
.where(device.group.id.eq(deviceGroup.id),
device.status.eq(DeviceStatus.NO_SYNC)), "noSyncQty"),
Expressions.as(queryFactory.select(device.count())
.from(device)
.where(device.group.id.eq(deviceGroup.id),
device.status.eq(DeviceStatus.NEED_SERVICE)), "needServiceQty"),
Expressions.as(queryFactory.select(device.count())
.from(device)
.where(device.group.id.eq(deviceGroup.id),
device.status.eq(DeviceStatus.OUT_OF_SERVICE)), "outOfServiceQty")))
.from(deviceGroup)
.leftJoin(deviceGroup.customer, workgroup).fetchJoin()
.leftJoin(workgroup.account, account).fetchJoin()
.where(predicate)
.orderBy(sortingParams.toArray(new OrderSpecifier[0]));
MyWrapper看起来像:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MyWrapper{
private Long id;
private String name;
private DsmsOrientationType orientation;
private String location;
private WorkgroupEntityJpa customer;
private AccountEntityJpa account;
private long displaysQty;
private long healthyQty;
private long noSyncQty;
private long needServiceQty;
private long outOfServiceQty;
}
而且我有异常查询指定连接提取,但提取关联的所有者不在选择列表中。
我已经尝试过deviceGroup.customer.account而不是workgroup.account,结果是一样的。
UPD 这是JPAQuery.toString():
select deviceGroupEntityJpa.id,
deviceGroupEntityJpa.name,
deviceGroupEntityJpa.orientation,
deviceGroupEntityJpa.location,
deviceGroupEntityJpa.customer,
workgroupEntityJpa.account,
(select count(deviceEntityJpa)
from DeviceEntityJpa deviceEntityJpa
where deviceEntityJpa.group.id = deviceGroupEntityJpa.id) as displaysQty,
(select count(deviceEntityJpa)
from DeviceEntityJpa deviceEntityJpa
where deviceEntityJpa.group.id = deviceGroupEntityJpa.id and deviceEntityJpa.status = ?1) as healthyQty,
(select count(deviceEntityJpa)
from DeviceEntityJpa deviceEntityJpa
where deviceEntityJpa.group.id = deviceGroupEntityJpa.id and deviceEntityJpa.status = ?2) as noSyncQty,
(select count(deviceEntityJpa)
from DeviceEntityJpa deviceEntityJpa
where deviceEntityJpa.group.id = deviceGroupEntityJpa.id and deviceEntityJpa.status = ?3) as needServiceQty,
(select count(deviceEntityJpa)
from DeviceEntityJpa deviceEntityJpa
where deviceEntityJpa.group.id = deviceGroupEntityJpa.id and deviceEntityJpa.status = ?4) as outOfServiceQty
from DeviceGroupEntityJpa deviceGroupEntityJpa
left join fetch deviceGroupEntityJpa.customer as workgroupEntityJpa
left join fetch workgroupEntityJpa.account as accountEntityJpa
解决方案
根据错误消息,此处不需要 join fetch,因为这是强制加载集合的性能提示。
所以使用常规连接而不是连接获取。
推荐阅读
- c# - 有没有办法从另一个项目中获取一个类的实例?
- ruby - 如何在 Ruby 的“坚固”gem 中获取 git 存储库的默认分支?
- utf-8 - 当数组包含 UTF-8 字符时,CodeCeption assertContains 失败
- angular - 将 Angular 从 4 升级到 6 时使用 angular2-jwt 和 AuthHttp 的问题
- latex - Latex BibTex 找不到数据库条目
- visual-studio - SQL Server 是否使用 Windows 身份验证从 Azure 连接到 Visual Studio?
- c++ - 如何创建 Gdk::Pixbuf 实例的 std::map 并在 Gdk::Cairo 中使用它
- php - 如何从 sql 数据库中删除两个不同数据相等的行?
- leaflet - 不添加带有传单地图和 L.Routing.control 的添加 css 的自定义标记
- datetime - 在给定时间之间创建随机分钟日期