当前位置: 首页 > 知识库问答 >
问题:

如何在join fetch QueryDSL jpaquery中进行选择?

柳向明
2023-03-14

我有一个带有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]));
@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,结果是一样的。

以下是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

共有1个答案

赵健柏
2023-03-14

根据错误消息,join fetch在这里不需要,因为这是一个性能提示,强制急切地加载集合。

因此使用常规联接而不是联接提取。

 类似资料:
  • 要组织和排列您的图稿,请使用工具以便精确地选择、放置和堆叠对象。您可以测量和对齐对象;编组对象以便能够将其视为一个单元进行操作;有选择地隔离、锁定或隐藏对象。 选区选项和首选项 用于选择对象的选项 在可以修改某个对象之前,需要将其与周围的对象区分开来。只需选择对象,即可加以区分。只要选择了对象或者对象的一部分,即可对其进行编辑。 Illustrator 提供以下选择方法和工具: 隔离模式 可让您快

  • 如何构建查询来实现这一点?

  • 本文向大家介绍如何进行特征选择?相关面试题,主要包含被问及如何进行特征选择?时的应答技巧和注意事项,需要的朋友参考一下 去除方差较小的特征

  • 问题内容: 如何应用ng-translate来翻译选择框内的选项。 例如: 模板: 控制器: enUS.json: 我试过像这样添加过滤器, 但很显然它是在向数组而不是单个元素添加过滤器 我尝试编写自己的过滤器(对此我是陌生的) 但我得到以下错误 这似乎是一个简单的任务,但已经用了我一半的时间,我在做什么错了:( 问题答案: 您需要将过滤器应用于而不是应用于数组: 这是一个演示

  • 问题内容: 我正在尝试学习如何在Java程序中使用sqlite数据库。(不是Android)。我转到此链接,下载了jdbc库并复制了示例。该示例工作无误。然后,我向数据库中添加了另一个表,并希望将两个表连接起来,并从每个表中选择一次列。我在从数据库进行查询的行上收到错误。我尝试了多种不同的方式来联接表和进行选择,但是每次我遇到异常时。有人可以告诉我正确的语法以在sqlite中联接两个表吗?这是我的

  • 我想选择要应用样式的前两行,但无法选择它们。 我试过很多方法,但都行不通。 文件“C:\Users\dell\AppData\Local\Programs\Python37-32\lib\site packages\pandas\core\index\base.py”,第2897行,在get\u loc return self中_发动机获取pandas中第107行的_loc(键)文件“pandas