Повторяющиеся данные из запроса JPA (ограничение sql) - PullRequest
0 голосов
/ 04 мая 2018

По какой-то причине я возвращаю 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);

SQL-запрос, который возвращает 9 различных строк данных, приведен ниже. Запросы кажутся идентичными.

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);

Вот как я перебираю значения. Я установил свой отладчик и заметил те же 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 в fcoDesignCd, даже если эта таблица уже имеет идентификатор? fcoDesignCd столбец, на который ссылаются, в соединении?

@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 Как добавить уникальное ограничение для столбца для отношения @OneToMany, как для имени пользователя

1 Ответ

0 голосов
/ 04 мая 2018

Вы не должны добавлять другой столбец @Id для своей таблицы, так как у вас уже есть один. Удостоверьтесь, что это скопировано с уникальным ограничением в базе данных.
Переопределение hashCode и equals также выглядит нормально.
Проблема с дубликатами, вероятно, в запросе.

...