我將從結(jié)果開始。在下一張圖片中,我將顯示 company.userAccount 的結(jié)果內(nèi)容。在數(shù)據(jù)庫中,我只有兩家公司分配給同一個(gè)用戶,其中一家公司有 7 項(xiàng)服務(wù)。@Entity@Table(name = "user_account")@Data@Introspected@JsonIgnoreProperties(value = {"id"})public class UserAccount { ... @OneToMany(mappedBy = "userAccount", fetch = FetchType.EAGER) private List<Company> companies = new ArrayList<>();}@Entity@Table(name = "company")@Data@Introspected@ToString(exclude = {"userAccount"})@JsonIgnoreProperties(value = {"id", "userAccount"})public class Company { ... @ManyToOne(optional = false) @JoinColumn(name = "user_account_id", updatable = false, nullable = false) private UserAccount userAccount;}@Entity@Table(name = "service")@Data@Introspected@ToString(exclude = {"company"})@JsonIgnoreProperties(value= {"id", "company"})public class Service { ... @ManyToOne(optional = false) @JoinColumn(name = "company_id", updatable = false, nullable = false) private Company company;}@Transactionalpublic Service saveService(@Valid @Uuid UUID companyUuid, SaveServiceCommand command) { Company company = companyRepository.getCompanyByUuid(companyUuid).orElseThrow(() -> new NoSuchElementException("unrecognized company")); Service service = new Service(); service.setCompany(company); service.setName(command.getName()); service.setUuid(UUID.randomUUID().toString()); return companyRepository.saveCompanyService(service);}@Transactionalpublic Service saveCompanyService(@Valid Service service) { entityManager.persist(service); return service;}生成的查詢(簡化)是select * from user_account a left outer join company c on a.id=c.user_account_id left outer join service s on c.id=s.company_id; 這將產(chǎn)生預(yù)期結(jié)果:我期望在 UserAccount 中只看到 2 家公司,其中一家公司有 6 項(xiàng)服務(wù)。為什么我會(huì)有這個(gè)結(jié)果?為什么同一個(gè)公司對象多次出現(xiàn)在列表中?我怎樣才能避免這種情況?我相信一種解決方案是將 @OneToMany 關(guān)系的獲取類型更改為 LAZY (因?yàn)樗鼈兪悄J(rèn)的)(已經(jīng)測試了該解決方案并且它有效),但是如果我需要這種類型的場景怎么辦?
1 回答

楊__羊羊
TA貢獻(xiàn)1943條經(jīng)驗(yàn) 獲得超7個(gè)贊
是的,有兩家公司,就像你說的那樣。您可以注意到,所有對象都是相同的(哈希值匹配)。其背后的原因是該查詢?yōu)橐患夜旧?6 行,并且PersistenceBag
hibernate 使用的查詢默認(rèn)情況下不會(huì)刪除重復(fù)項(xiàng)。傳遞distinct
給你的 sql 是行不通的,因?yàn)橹挥幸粋€(gè)父實(shí)體。
但這可以通過使用hibernate的查詢提示來實(shí)現(xiàn)。傳遞QueryHints.HINT_PASS_DISTINCT_THROUGH
給 yourQuery
只是刪除重復(fù)的子項(xiàng)。
添加回答
舉報(bào)
0/150
提交
取消