我將從結果開始。在下一張圖片中,我將顯示 company.userAccount 的結果內容。在數據庫中,我只有兩家公司分配給同一個用戶,其中一家公司有 7 項服務。@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; 這將產生預期結果:我期望在 UserAccount 中只看到 2 家公司,其中一家公司有 6 項服務。為什么我會有這個結果?為什么同一個公司對象多次出現在列表中?我怎樣才能避免這種情況?我相信一種解決方案是將 @OneToMany 關系的獲取類型更改為 LAZY (因為它們是默認的)(已經測試了該解決方案并且它有效),但是如果我需要這種類型的場景怎么辦?
1 回答

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