【发布时间】:2021-04-14 10:42:57
【问题描述】:
在我的 springboot 应用程序中,我有这 3 个实体:
@Entity
public class Process {
@Id
private Long Id;
@ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
@JoinColumn(name = "input_id")
private Input input;
...
}
@Entity
public class Input{
@Id
private Long Id;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "template_id")
private Template template;
...
}
@Entity
public class Template{
@Id
private Long Id;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "template_id")
private Template template;
private String name;
...
}
总之,Process 对 Input 有一个 FK,Input 对 Template 有一个 FK。
我想过滤模板具有特定名称的进程。这是我要执行类似操作的 SQL:
select
*
from
process p
left outer join
input i
on p.input_id=i.id
left outer join
template t
on i.template_id=t.id
where
t.name='templateName'
这是我目前在我的流程实体中访问模板的内容:
@ManyToOne
@JoinTable(name = "Input",
joinColumns = {@JoinColumn(table = "Input", referencedColumnName = "id")},
inverseJoinColumns = {
@JoinColumn(name = "template_id", referencedColumnName = "id", table = "Template")})
private Template template;
这是我的 ProcessRepository 类,我现在可以在其中访问所需的查找方法:
@Repository
public interface ProcessRepository extends PagingAndSortingRepository<Process, Long> {
...
List<Process> findByTemplateNameEquals(String templateName);
...
}
当我执行 findByTemplateNameEquals 方法时,我会检索流程和一个模板。但是我得到的结果并不是我所期望的。 我启用了 sql 日志记录,这是真正执行的查询(我隐藏了列,这里不重要):
select
...
from
process process0_
left outer join
input process0_1_
on process0_.id=process0_1_.id
left outer join
template template1_
on process0_1_.template_id=template1_.id
where
template1_.name=?
Process 和 Input 之间的连接存在一个问题。它执行
from
process process0_
left outer join
input process0_1_
on process0_.id=process0_1_.id
而不是
from
process process0_
left outer join
input process0_1_
on process0_.input_id=process0_1_.id
我不明白为什么它使用进程的 PK 而不是 FK 来输入。 我尝试了几件事来解决这个问题:
- 在joinColumns中添加name="input_id" = {@JoinColumn(... 但不是替换FK,而是替换输入的PK=>执行过程中失败
- 将 joinColumns = {@JoinColumn(...) 中的 referencedColumnName 替换为“input_id”,但启动失败。
- 在多个位置(直接在@JoinTable、@JoinColumn 甚至 Input 输入属性的 @JoinColumn 中)配置了 @ForeignKey(name = "input_id"),但没有任何变化。
我还指出,joinColumns = {@JoinColumn(table = "Input", referencedColumnName = "id")} 不是必需的,因为如果我删除它,我也会有同样的行为。
有人可以帮我解决这个问题吗?
在此先感谢
【问题讨论】:
标签: java hibernate spring-data-jpa