老实说,我不知道如何表达问题的标题,如果有人有建议,请让我知道。
我的用例是这样的,我有一个实体,它的帐户属性是这样的(这是为了避免混乱而清理的):
@Entity
@Table(name = "report_line", schema = "public")
public class ReportLine extends BaseReportLine {
@ManyToOne
@JoinColumn(name = "report_id")
private Report report;
@ManyToOne
@JoinColumn(name = "account_id")
private Account account;
}
但只有帐户id/不同属性的dto:
public class ImportLineDto {
public String groupName;
public Integer position;
public Integer parentPosition;
public String accountId;
public String name;
public BigDecimal amount;
public List<ImportLineDto> lines = new ArrayList<>();
}
我需要检查/展平所有行,以便将其保存到jpa存储库,但有两个问题:
有没有一种方法可以只使用accountid创建表行对象,而不必查找每行的帐户,因为这将添加大量不必要的db调用。
展平后,我应该如何处理每个表对象上的“线”?我应该将它们设置为空/空列表吗?
有更好的方法吗?这一次,我真的可以修改代码了
以下是我到目前为止的情况:
private void saveReport(ImportedResult result) {
Report report = new Report();
...
report.setLines(getReportLinesFromDtoLines(result.lineItems.lines));
ReportRepository.saveAndFlush(report);
}
private List<ReportLine> getReportLinesFromDtoLines(ImportLineDto lines) {
List<ImportLineDto> flatLines = flatMapRecursive(lines).collect(Collectors.toList());
List<ReportLine> reportLines = new ArrayList<>();
for(ImportLineDto line: flatLines) {
ReportLine reportLine = new ReportLine();
reportLine.setItemText(line.name);
reportLine.setAmount(line.amount);
reportLine.setAccount(???);
// how do I set the 'Account' property using the id only, without looking up each account?
reportLines.add(reportLine);
}
return ReportLines;
}
public Stream<ImportLineDto> flatMapRecursive(ImportLineDto item) {
if (item.lines == null) {
return Stream.empty();
}
return Stream.concat(Stream.of(item), item.lines.stream()
.flatMap(this::flatMapRecursive));
}
跟进:
如果dto accountid不是表中的实际“id”字段,而是另一个自定义字段,我遇到了另一种类似的情况,这可能吗?我仍然需要第一个问题的答案,但是要有一个标准的id。
1条答案
按热度按时间nlejzf6q1#
您可以使用entitymanager.getreference,如下所述