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

QueryDsl投影将字段留空

穆季萌
2023-03-14
java prettyprint-override">@Entity
public class DocumentConsolidated {
    @Id private UUID id;

    @OneToOne(fetch = FetchType.EAGER, optional = false, cascade = CascadeType.ALL)
    @JoinColumn(name = "metadata_id")
    private DocumentMetadata documentMetadata;

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "documentConsolidated")
    private DocumentConfiguration documentConfiguration;
}

@Entity
public class DocumentConfiguration {
    @Id private UUID id;

    @OneToOne(fetch = FetchType.LAZY)
    @MapsId
    private DocumentConsolidated documentConsolidated;
}

// Service code:
QDocumentConsolidated qDoc = QDocumentConsolidated.documentConsolidated;
(JPQLQueryFactory) queryFactory
        .select(Projections.fields(qDoc, /*qDoc.id, */qDoc.documentConfiguration, qDoc.documentMetadata))
        .from(qDoc)
        .innerJoin(qDoc.documentConfiguration)
        .fetch();

这只有两种方式:

  • 具有qdoc.id:id存在,documentconfiguration为空
  • 不带qdoc.id:ID为空,DocumentConfiguration存在

我已经检查过的内容:当我在Postgres客户机中运行Hibernate查询时,它总是带来documentconfiguration字段。Botdocumentmetadata在这两种情况下都存在。

共有1个答案

邹宏峻
2023-03-14

问题没有得到解决,但我通过从混合中删除投影来解决它:

// Service code:
QDocumentConsolidated qDoc = QDocumentConsolidated.documentConsolidated;
QDocumentConfiguration qCfg = qDoc.documentConfiguration;
QDocumentMetadata qMeta = qDoc.documentMetadata;

return queryFactory
        .select(qDoc, qCfg, qMeta) // <-- get rid of Projections
        .from(qDoc)
        .innerJoin(qCfg) // <-- manual join on Lazy entity (qMeta is auto-joined)
        .fetch().stream()
        .map(tuple -> { // <-- entity creation, similar with Projections.bean()
            DocumentConsolidated documentConsolidated = Objects.requireNonNull(tuple.get(qDoc));
            documentConsolidated.setDocumentMetadata(tuple.get(qMeta));
            documentConsolidated.setDocumentConfiguration(tuple.get(qCfg));
            return documentConsolidated;
        })
        .collect(Collectors.toList());
 类似资料:
  • 给定这个查询: 问题是查询只在parentDevice不为空时返回设备。为什么?如何拿回任何价值?如果我从投影中取出qdevice.parentdevice,结果是好的。 QueryDsl版本为3.2.0

  • 我试图使用一个投影来从一个实体中提取数据,它有一些关系。然而。投影上的构造函数接受三个参数;一个集合,整数和另一个整数。如果没有这个集合作为参数,这一切都很好,但是一旦我添加了这个集合,我就开始得到SQL语法查询错误。 这里有一个我正在使用的例子... 下面是我正在使用的查询(不完全相同,因为这是我正在处理的问题的简化版本).... 所以,我想我的主要问题是,我如何将一个集合作为一个对象包含在投影

  • 但是如果可能的话,我想避免这种情况,因为它迫使我定义n个构造函数,为我在投影中想要的n个字段组合定义n个构造函数。

  • 我正在考虑使用DTO投影--我有两个具有一对多关系的实体(EntityOne的一个实例链接到EntityTwo的多个实例),我希望将结果作为一个新的DTO对象返回--我目前正在尝试的是: 其中MyDtoObject如下所示: 但是,这带来的MyDtoObjects比预期的要多得多,而且看起来每个对象都只包含一个entityTwo对象,而不是集合。 如何指示queryDSL创建具有多个entityT

  • 我想优化一个queryDSL+Spring数据查询。目前我使用BooleanBuilder作为谓词,这很好,但是它连接了太多的表。我不需要表中的所有列,也不需要某些表。我相信使用投影会减少加入的表的数量。 那么,如何使QueryDSL连接表而不是从所有表中进行选择呢?我尝试优化查询是否正确?投影有意义吗?