将一个表的连接列与另一个表的一列组合成 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。
我有两个实体,分别称为 Operation
和 CanceledOperation
:
操作:
@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
我正在尝试加入 operation
和 canceledIperation
以显示取消操作和 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<Operation>
但操作与域模型中的 Canceled 操作没有关系(至少在发布的代码中没有)。 得到一个空列到底是什么意思?
【参考方案1】:
好吧,我找到了一种简单的方法,而不是进行复杂的查询,我使用了每个表的findAll()
然后我将raison
属性从CanceledOperation
影响到message
属性@987654325 @ 使用stream
和map
从存储库接收到的两个列表。
【讨论】:
【参考方案2】:在CanceledOperation实体中,能否给出referencedColumnName = "ID" 试试?
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "OPERATION_ID",referencedColumnName = "ID", nullable = false)
private Operation operation;
【讨论】:
以上是关于将一个表的连接列与另一个表的一列组合成 JAVA 对象的主要内容,如果未能解决你的问题,请参考以下文章