将一个表的连接列与另一个表的一列组合成 JAVA 对象

Posted

技术标签:

【中文标题】将一个表的连接列与另一个表的一列组合成 JAVA 对象【英文标题】:combine joined columns of a table with one column of another table into JAVA object 【发布时间】:2021-03-28 16:06:02 【问题描述】:

我想将不同表的列合并到一个实体(对象)中,但我得到一列 null,即使它不为 null。 我有两个实体,分别称为 OperationCanceledOperation

操作:

@Entity
@Table(name = "OPERATIONS")
public class Operation

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID", unique = true, nullable = false)
private Long id;

@Column(name = "Date")
private Timestamp date;

@Transient
private String message;
    
// Other attributes and getters & setters

取消操作:

@Entity
@Table(name = "CANCELED_OPERATIONS")
public class CanceledOperation

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private Long id;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "OPERATION_ID", nullable = false)
    private Operation operation;

    @Column(name = "RAINSON")
    private String raison;
//getters & setters

我正在尝试加入 operationcanceledIperation 以显示取消操作和 null 未取消操作的原因。

这是我的存储库中的本机查询:

@query(value = "SELECT op.* , co.raison as raison FROM operations op LEFT JOIN canceled_operations co ON op.ID  = co.OPERATION_ID", countQuery = "SELECT count(*) FROM operations op LEFT JOIN canceled_operations co ON op.ID  = co.OPERATION_ID")
    Page<Operation> getAllOperations(Pageable pageable);

这就是我调用我的存储库的方式:

final Page<Operation> operations= operationRepository.getAllOperations(pageable);

我尝试了许多解决方案,即使用Object[] 而不是Operation,我还在operation 实体中添加了一个名为raison 的属性,带有@transient 注释,但即使这样我仍然得到理由是空的。 你能给我一个提示来解决这个问题吗? 提前致谢。

【问题讨论】:

我很困惑。您返回 Page&lt;Operation&gt; 但操作与域模型中的 Canceled 操作没有关系(至少在发布的代码中没有)。 得到一个空列到底是什么意思? 【参考方案1】:

好吧,我找到了一种简单的方法,而不是进行复杂的查询,我使用了每个表的findAll() 然后我将raison 属性从CanceledOperation 影响到message 属性@987654325 @ 使用streammap 从存储库接收到的两个列表。

【讨论】:

【参考方案2】:

在CanceledOperation实体中,能否给出referencedColumnName = "ID" 试试?

@OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "OPERATION_ID",referencedColumnName = "ID", nullable = false)
    private Operation operation;

【讨论】:

以上是关于将一个表的连接列与另一个表的一列组合成 JAVA 对象的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 将多个 SQL 列组合成 HTML 表的单个列

如何将一个熊猫数据框的一列与另一个数据框的每一列相加?

Excel:VLOOKUP 将一列与另一张表匹配并连接数据

oracle一个表中没有主键怎么设置主键

如何将两个HTML表的输出组合成单个列和一些列

显示一列与另一列相比的缺失值