You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 12:40:58