【发布时间】:2021-04-01 07:55:36
【问题描述】:
@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 字段。 Bot documentMetadata 在这两种情况下都存在。
【问题讨论】:
-
我在这里大声思考,可能很离谱,但在这里。 querydsl
Q类表示表,并将所有列及其数据类型映射到 Java 数据类型。所以QDocumentConsolidated不知道QDocumentConfiguration,因为QDocumentConfiguration具有QDocumentConsolidated的FK。 JPA 不在其中,Q文件只有值,而不是复杂对象。因此,QDocumentConsolidated的 FK 将是NumberPath<Long>而不是DocumentConsolidated实例。您是否尝试过投影到包含您需要的字段的 Java bean 中? -
嘿@RobertBain!抱歉回复晚了。不确定bean映射是什么意思。如果您的意思是
Projections.bean(...)我已经测试过,documentConfiguration仍然为空。当使用Projections创建查询时,我怀疑问题来自某些 ID 或数据冲突,并且它不知道如何取回数据。我设法通过使用简单的实体来解决这个问题 - 请参阅我的答案。
标签: java projection querydsl