来自 JPA 查询的重复数据(sql 约束)

Posted

技术标签:

【中文标题】来自 JPA 查询的重复数据(sql 约束)【英文标题】:Duplicate data from JPA query (sql constraint) 【发布时间】:2018-10-14 23:41:38 【问题描述】:

由于某种原因,我在存储库中使用此查询返回了 9 行重复数据。

 @Query("select distinct profile from OfficeProfile profile where profile.fcoDesignCd in 
(select officeLocation.asccode from OfficeLocation officeLocation, OfficeProfile profile 
where officeLocation.statecode = :stateCode and officeLocation.asccode = profile.fcoDesignCd)")     
    public List<OfficeProfile> searchStateASC(@Param("stateCode") String stateCode);

返回 9 个不同数据行的 sql 查询如下。查询似乎是相同的。

select
op.FCO_DESIGN_CD,
op.office_addr_line1,
op.office_addr_line2,
op.office_addr_state,
op.office_addr_zip
from cridba.office_profile op
where op.fco_design_cd in  (
select asc_code from cridba.cris_lk_location cll , cridba.office_profile op
where cll.state_code='VA'
and cll.asc_code = op.fco_design_cd);

这就是我迭代这些值的方式。我设置了我的调试器,并注意到带有 id 的 9 个值。

for(OfficeProfile locationInfo: officeLocatorRepository.searchStateASC(stateCode))

这是我的实体关系。 办公室简介(父)

@OneToMany(cascade = CascadeType.ALL,
        fetch = FetchType.LAZY,
        mappedBy = "profile")
private Set<OfficeLocation> officeLocation = new HashSet<>(0);

办公地点(儿童)

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "asc_code", referencedColumnName = "fco_design_cd", nullable = false, insertable=false, 
updatable=false)
public OfficeProfile profile;

我在两个类中都覆盖了 equals 和 hashcode。因为我使用 asc_code 加入这些表,所以我会覆盖它还是 id?或两者?这是我到目前为止所拥有的。

@Override
public boolean equals(Object o) 
    if (this == o) 
        return true;
    
    if (o == null || getClass() != o.getClass()) 
        return false;
    
    OfficeProfile officeProfile = (OfficeProfile) o;
    if (officeProfile.getId() == null || getId() == null) 
        return false;
    
    return Objects.equals(getId(), officeProfile.getId());


@Override
public int hashCode() 
    return Objects.hashCode(getId());

即使这个表已经有一个 id,我是否应该将 @Id 添加到 fcoDesignCd 中? fcoDesignCd是join中的引用列吗?

@Column(name = "fco_design_cd")
private String fcoDesignCd;

HQL 输出...

select distinct officeprof0_.office_type_id as office_type_id1_1_, ......
from cridba.office_profile officeprof0_ where officeprof0_.fco_design_cd in 
(select officeloca1_.asc_code 
from cridba.cris_lk_location officeloca1_, cridba.office_profile 
officeprof2_ where officeloca1_.state_code=? and 
officeloca1_.asc_code=officeprof2_.fco_design_cd)

这看起来是正确的道路吗? JPA How add unique contraint on column for @OneToMany relation like on username

【问题讨论】:

【参考方案1】:

您不应该为您的表添加另一个@Id 列,因为您已经有了一个。确保使用数据库中的唯一约束对其进行备份。 hashCode 和 equals 的覆盖看起来也不错。 重复的问题可能出在查询中。

【讨论】:

以上是关于来自 JPA 查询的重复数据(sql 约束)的主要内容,如果未能解决你的问题,请参考以下文章

sql 2005 语句 身份号码不重复

SQL多个主键的表,插入数据有重复时,查询数据的重复值?

JPA 查询部分字段

sqlserver怎么在查询分析器里给数据列添加唯一约束

Sql Server 主键 外键约束

来自 UPDATE 查询的“SQL 命令未正确结束”错误 [重复]