2 回答
TA贡献1856条经验 获得超17个赞
因此,您希望通过 requestNo 将所有 TransitionAction 链接到 Project
您可以通过像这样添加@ManyToOneMapping来实现这TransactionAction一点
@ManyToOne(fetch = FetchType.LAZY)
private Project project;
现在您需要像这样修改您的查询
@Query("SELECT project FROM Project project where project.status.id=1")
List<Project> getAllUserProjects();
获取TransactionAction给定项目的所有信息
Set<TransitionAction> allTatcts = project.getTacts();
您不需要在查询中添加连接。一旦您通过实体从 Project 中提取 TransactionAction ,Hibernate 就会处理这个问题。
编辑1:
但是为什么我的查询失败了?为什么项目的主键加入了 TransitionAction 的 request_no ?
您的查询失败,因为在执行@OneTOMany关系时 yodidn't 定义@JoinColumn or @JoinTable哪个是单向映射。
在这种情况下,Hibernate 将使用主键列进行映射。
并且由于主键和列的类型不同,因此错误。
没有描述任何物理映射(没有@JoinColumn 或@JoinTable),使用单向一对多连接表。表名是所有者表名、_ 和另一侧表名的串联。引用所有者表的外键名称是所有者表、_ 和所有者主键列名称的串联。引用另一侧的外键名称是所有者属性名称 _ 和另一侧主键列名称的串联。将唯一约束添加到引用另一侧表的外键以反映一对多。
更多细节请参考官方文档
@OneToMany
@JoinTable(
name="table_name",
joinColumns = @JoinColumn( name="columnname")
)
private Set<TransitionAction> tacts;
TA贡献1827条经验 获得超8个赞
这是因为您在 TransactionAction 类中的 request_no 上有 @Id 并且当您加入两个类时,它们会加入主键。
您可以改用交叉连接。
SELECT project FROM Project project, TransactionAction pta where project.request_no= pta.request_no and project.status.id=1
或者你可以有双向映射。在您的 TransactionAction 实体类中添加以下内容。
@ManyToOne private Project Project;
然后您的查询将如下所示。
select pta.project from TransactionAction pta where pta.request_no=pta.project.request_no and pta.project.status.id=1
添加回答
举报