为了账号安全,请及时绑定邮箱和手机立即绑定

春靴 - 使用额外列进行多对多关系的分页

春靴 - 使用额外列进行多对多关系的分页

潇潇雨雨 2022-08-17 15:23:46
在对多对多关系使用额外列时,我找不到一种干净简单的方法来进行分页。我的模型看起来像这样:我有一个用户和一个产品模型。每个用户可以消费n种产品。每个消耗将存储在一个额外的表中,因为我想存储额外的信息,如日期等。我已经实现了如下模型并且它的工作原理,但我想将用户的消费作为可寻呼的,而不是检索整个集合。实现它的最佳方法是什么?@Entitypublic class User {    @Id    @GeneratedValue(strategy = GenerationType.AUTO)    private Long id;    @OneToMany(            mappedBy = "user",            cascade = CascadeType.ALL,            orphanRemoval = true    )    private List<Consumption> consumptionList = new ArrayList<>(); // never set this attribute    public List<Consumption> getConsumptionList() {        return consumptionList;    }    public void addConsumption(Product product) {        Consumption consumption = new Consumption(this, product);        consumptionList.add(consumption);        product.getConsumptionList().add(consumption);    }    public void removeConsumption(Consumption consumption) {        consumption.getProduct().getConsumptionList().remove(consumption);        consumptionList.remove(consumption);        consumption.setUser(null);        consumption.setProduct(null);    }}--@Entity@NaturalIdCache@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)public class Product {    @Id    @GeneratedValue(strategy = GenerationType.AUTO)    private Long id;    @OneToMany(            mappedBy = "product",            cascade = CascadeType.ALL,            orphanRemoval = true    )    private List<Consumption> consumptionList = new ArrayList<>();    public List<Consumption> getConsumptionList() {        return consumptionList;    }}这是我存储消耗的类。@Entitypublic class Consumption {    @EmbeddedId    private UserProductId id;    @ManyToOne(fetch = FetchType.LAZY)    @MapsId("userId")    private User user;}我希望能够调用一个方法,例如“getConsumptionList(Page page)”,然后返回一个Pageable。我希望你能帮助我!
查看完整描述

2 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

好吧,如果使用Spring Boot,你可以使用存储库:


@Repository

public interface ConsumptionRepo extends JpaRepository<Consumption, Long>{

    List<Consumption> findByUser(User user, Pageable pageable);

}

然后你可以简单地调用它


ConsumptionRepo.findByUser(user, PageRequest.of(page, size);


查看完整回答
反对 回复 2022-08-17
?
MMTTMM

TA贡献1869条经验 获得超4个赞

由于@mtshaikh想法,我终于为我的问题找到了解决方案:


只需实现一个分页服务:


public Page<Consumption> getConsumptionListPaginated(Pageable pageable) {

        int pageSize = pageable.getPageSize();

        int currentPage = pageable.getPageNumber();

        int startItem = currentPage * pageSize;


        List<Consumption> list;


        if (consumptionList.size() < startItem) {

            list = Collections.emptyList();

        } else {

            int toIndex = Math.min(startItem + pageSize, consumptionList.size());

            list = consumptionList.subList(startItem, toIndex);

        }


        return new PageImpl<>(list, PageRequest.of(currentPage, pageSize), consumptionList.size());


    }


查看完整回答
反对 回复 2022-08-17
  • 2 回答
  • 0 关注
  • 85 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信