在ManyToMany关系

时间:2017-08-16 14:16:24

标签: java hibernate jpa spring-data spring-data-jpa

我想查询公司的所有产品。产品应加载国家列表。我设法写了一个Spring JPA存储库方法来查询我想要的东西,但我想知道为什么我需要一个DISTINCT子句

如果我运行以下查询,我会在每个国家/地区获得一个产品。因此,如果产品有3个国家/地区,则查询将返回相同的3行。 你能解释一下原因吗?

@EntityGraph(attributePaths = "countries", type = EntityGraph.EntityGraphType.LOAD)
List<Product> findByCompanyIdOrderByIdAsc(Long companyId);

为了解决这个问题,我添加了一个Distinct子句,它返回我想要的内容。

@EntityGraph(attributePaths = "countries", type = EntityGraph.EntityGraphType.LOAD)
List<Product> findDistinctByCompanyIdOrderByIdAsc(Long companyId);

如果我运行的JPQL Select p from Product LEFT JOIN FETCH p.countries WHERE p.company.id = ?1等同于findByCompanyIdOrderByIdAsc,我会遇到同样的问题。

实体:

public class Product implements Serializable {

    @ManyToOne
    @JsonIgnore
    private Company company;

    @ManyToMany
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    @JoinTable(name = "product_country",
        joinColumns = @JoinColumn(name="product_id", referencedColumnName="id"),
        inverseJoinColumns = @JoinColumn(name="country_id", referencedColumnName="id"))
    @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id",
        resolver = EntityIdResolver.class, scope = Country.class)
    @JsonIdentityReference(alwaysAsId = true)
    private Set<Country> countries = new HashSet<>();

}

public class Country implements Serializable {
}

0 个答案:

没有答案