JPA查询返回重复WorkflowRoute对象而非预期不同对象求助
问题根源及解决方案
核心问题是数据库中五条WorkflowRoute记录的主键(workflowid + routeid)完全重复,而JPA依赖主键来区分实体唯一性。当查询到多条主键相同的记录时,EntityManager会将它们映射为同一个实体对象,因此你得到的是数量正确但内容完全重复的结果。
从你提供的数据库数据可以看到,五条记录的workflowid和routeid完全一致,仅instance、inputmoduleid、outputmoduleid不同,但这两个字段是你定义的复合主键,导致JPA无法识别这些是不同的实体。
解决方案
1. 修正主键设计
需要将instance字段加入复合主键,因为它是五条记录中唯一能区分的字段。修改后的复合主键为:workflowid + routeid + instance。
2. 更新实体类
修改WorkflowRoute实体,给instance字段添加@Id注解:
// package and imports @Entity @IdClass(WorkflowRouteId.class) @Table(name = "workflowroute") @Getter @Setter @NoArgsConstructor @AllArgsConstructor public class WorkflowRoute { @Id @Column(name = "instance", nullable = false) private short instance; @Column(name = "inputmoduleid", nullable = false) private UUID inputModuleId; @Column(name = "outputmoduleid", nullable = false) private UUID outputModuleId; @Column(name = "waitall", nullable = false) private boolean waitAll; @Id @ManyToOne @JoinColumn(name = "workflowid", referencedColumnName = "id", nullable = false) private Workflow workflow; @Id @ManyToOne @JoinColumn(name = "routeid", referencedColumnName = "id", nullable = false) private Route route; }
3. 更新IdClass类
在WorkflowRouteId中添加instance字段,Lombok的@EqualsAndHashCode会自动将其纳入主键的相等性判断:
// package and imports @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode @Getter @Setter public class WorkflowRouteId implements Serializable { private UUID workflow; private UUID route; private short instance; }
4. 修正数据库约束
确保数据库表workflowroute已创建包含workflowid、routeid、instance的复合主键约束,防止后续插入重复主键的记录。
完成以上修改后,你的Repository查询方法就能返回正确的不同WorkflowRoute对象了。
内容的提问来源于stack exchange,提问作者Aregism
相关产品推荐
相关产品推荐

