我想查询公司的所有产品。产品应加载国家列表。我设法写了一个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 {
}