【发布时间】:2020-09-27 17:04:33
【问题描述】:
我正在尝试加载单个商家实体及其类别,商家和类别之间的关系是多对多。类别实体也有翻译...所以我编写了以下代码来从数据库中检索我需要的数据:
Merchant merchant = queryFactory.selectFrom(QMerchant.merchant)
.leftJoin(QMerchant.merchant.categories, QMerchantCategory.merchantCategory).fetchJoin()
.leftJoin(QMerchantCategory.merchantCategory.translations, QMerchantCategoryTranslation.merchantCategoryTranslation).fetchJoin()
.where(QMerchant.merchant.id.eq(merchantStore.getMerchant().getId()))
.fetchOne();
但是,我得到的结果是商家有三个类别(相同)的列表,每个类别都有三个翻译对象...
我可以在数据库中检查我正在尝试加载的与商家的关系中只有一个类别,正如您从 JVM ID 的图片中看到的那样,这些都是相同的实例......下面的代码也给出了相同的结果:
@EntityGraph(attributePaths = {"categories", "categories.translations"})
Optional<Merchant> findWithCategoriesById(long id);
如果添加另一个翻译,那么我将有四个类别的商家......
那么我如何告诉休眠加载列表中有一个类别实体的商家实体(因为它应该有,因为只有一个类别与商家相关联),但我还需要为该类别加载所有翻译,如果可能的话,用一个查询来解决它,我可以用两个查询来解决它,但我希望它只有一个......或者如果有更好的理由让两个查询从数据库中提取数据.. .?
【问题讨论】:
标签: java spring spring-boot hibernate jpa