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 函数/方法

Spring Data Jpa Specification 调用Oracle 函数/方法

spring jpa specification 怎么关联查询