第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

休眠多個(gè)@OneToMany 關(guān)系在父關(guān)系中生成更多結(jié)果

休眠多個(gè)@OneToMany 關(guān)系在父關(guān)系中生成更多結(jié)果

森林海 2023-06-21 13:28:23
我將從結(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 行,并且PersistenceBaghibernate 使用的查詢默認(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)。

查看完整回答
反對 回復(fù) 2023-06-21
  • 1 回答
  • 0 關(guān)注
  • 144 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號