Spring Data Specification 按特定字段连接
Posted
技术标签:
【中文标题】Spring Data Specification 按特定字段连接【英文标题】:Spring Data Specification Join by specific field 【发布时间】:2021-02-23 09:31:16 【问题描述】:我有一个看起来像这样的连接:
Join<RepairEntity, RepairAssignEntity> joinRepairAssignEntities = root.join(RepairEntity_.repairAssignEntities, LEFT);
转换成 SQL 后的样子
left outer join
repair_assign repairassi1_
on repairenti0_.id=repairassi1_.repair_id
我希望它是这样的:
left outer join
repair_assign repairassi1_
on repairenti0_.PARENT_ID=repairassi1_.repair_id
如果我向该联接添加条件:
Predicate equal = cb.equal(root.get(RepairEntity_.parentId), repairEntityPath.get(RepairEntity_.id));
joinRepairAssignEntities = joinRepairAssignEntities.on(equal);
成功了
left outer join
repair_assign repairassi1_
on repairenti0_.id=repairassi1_.repair_id
and (
repairenti0_.parent_id=repairassi1_.repair_id
)
如何摆脱
on repairenti0_.id=repairassi1_.repair_id
?
【问题讨论】:
【参考方案1】:似乎实体之间的关系不是很好,如果你想通过父字段加入它应该是这样的:
实体修复实体
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="PARENT_ID")
RepairAssignEntity repairAssignEntity;
实体修复分配实体
@OneToMany(mappedBy="repairAssignEntity", fetch=FetchType.LAZY)
List<RepairEntity> RepairEntities;
如果没有,您将不得不重组查询以使其适应 JPA 实体建模。
关于摆脱条件“on repairenti0_.id = repairassi1_.repair_id”你不能,因为它是实体中定义的隐含关系之一,但是如果你按照我的指示修改建模,只有条件“ repairenti0_.parent_id = repairassi1_ 会出现.repair_id "
【讨论】:
以上是关于Spring Data Specification 按特定字段连接的主要内容,如果未能解决你的问题,请参考以下文章
Spring data jpa 实现简单动态查询的通用Specification方法
Spring data jpa Specification查询关于日期的范围搜索
spring data jpa封装specification实现简单风格的动态查询
Spring Data Jpa Specification 调用Oracle 函数/方法