Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JPA将两个表连接到第三个表中的复合键_Java_Hibernate_Jpa - Fatal编程技术网

Java 使用JPA将两个表连接到第三个表中的复合键

Java 使用JPA将两个表连接到第三个表中的复合键,java,hibernate,jpa,Java,Hibernate,Jpa,我想使用Hibernate和JPA在三个表之间进行连接,如下所示: 表:[方括号中的主键] Worker: ([worker_id], tool_id, site_id) Toolbelt: ([toolbelt_id]) Site: ([site_id]) SiteToolbelt: ([site_id], toolbelt_id) Tool: ([toolbelt_id, tool_id], tool_name) 明确地说,这意味着具有相同刀具id的不同刀具带上的刀具可以有不同的名称 这是

我想使用Hibernate和JPA在三个表之间进行连接,如下所示:

表:[方括号中的主键]

Worker: ([worker_id], tool_id, site_id)
Toolbelt: ([toolbelt_id])
Site: ([site_id])
SiteToolbelt: ([site_id], toolbelt_id)
Tool: ([toolbelt_id, tool_id], tool_name)
明确地说,这意味着具有相同刀具id的不同刀具带上的刀具可以有不同的名称

这是我想要的SQL查询:

SELECT * FROM Worker w
JOIN SiteToolbelt st ON w.site_id = st.site_id
JOIN Tool t ON t.toolbelt_id = st.toolbelt_id AND t.tool_id = w.tool_id

我如何使用JPA做这样的事情?

从我的角度来看,工具id不合适,因为你不能仅从它的工具id获取工具,最好称它为工具类型或类似的东西。在这种情况下,只需使用可嵌入类作为复合id

你应该上这样的课

@Embeddable
public class ToolPK implements Serializable {
    @ManyToOne
    @JoinColumn(name = "TOOLBELT_ID")
    private Toolbelt toolbelt;
    private Long toolType;
//(getter setter here)
}
然后在工具类中将其用作主键

@EmbeddedId
private ToolPK toolPK;
//this is the real tool_id 
//not like tool_type which cant get you the object Tool without the toolbelt

然后,您只需要在用户中输入tool_type,而不需要输入tool_id(因为tool_id是复合的)。

您已经完成了任何映射类吗?忘了提到您还需要为该tool type添加标准列注释