jpa mysql去重复查询_JPA查询数据重复问题

在使用JPA做查询的时候,有时候要把实体对应的所有关联项都查询出来。下面的SellerListing实体中。"specificationConfigs","listingDocs"都是集合。使用@EntityGraph生成的sql语句全是LEFT OUTER JOIN。如果"specificationConfigs"有4条,"listingDocs"有3条,那查询出的数据就是3*4 = 12条。并且查询出的listingDocs、specificationConfigs会有重复的数据。

@EntityGraph(attributePaths = {"product","productSpec","specificationConfigs","listingDocs"})

@Query("SELECT DISTINCT listing FROM SellerListing listing WHERE listing.id=:id")

SellerListing findWithDetailsById(@Param("id") Long id);

解决方法:参考这里。和这里。

要去除这些重复数据,使用数据库是不明智的。所有只有查询出来后在java程序中去除,我这里把属性声明为LinkedHashSet,并且重写ListingDoc实体的hashCode和equals方法。利用set集合不能放重复对象的属性。把重复数据去除掉。

@OneToMany(mappedBy="listing",fetch=FetchType.LAZY)

private Set listingDocs = new LinkedHashSet();

public boolean equals(Object obj) {

if (obj == null || !(obj instanceof BaseEntity))

return false;

BaseEntity target = (BaseEntity) obj;

if(this.getId() == null || target.getId() == null)

return false;

return this.getId().equals(target.getId());

}

public int hashCode() {

return id == null ? 0 : id.hashCode();

}

特别注意:

如果查询出的是集合,并且要分页查询的时候。这种方式就有问题。因为分页是按照数据库数据分页的。查询出来再过滤,必然导致分页混乱。

@EntityGraph(attributePaths = {"product","productSpec","specificationConfigs","listingDocs"})

@Query("SELECT DISTINCT listing FROM SellerListing listing WHERE listing.title=:title")

List findWithDetailsByTitle(@Param("title") String title, Pageable pageable);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值