如何在Croud Repository中找到其特定列不同的最后10个实体?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (49)

我正在Spring Boot 2和Croud Repository上开发一个后端应用程序。

我有一个名为MoneyTransfer的表,表中有名为customerId和firmId的列。

我需要获得客户转账的最后10家公司。

目前,我为用户提供所有转账并过滤。但是,这种方法没有意义,因为我获取了数据库中的所有元素以查找最后10个。这可能会导致性能问题。

fun getList(customerId: String) {
   var list = mutableListOf<MoneyTransfer>()
   moneyTransferRepository.findByCustomerId(customerId).forEach {
      if (list.find(elem -> it.firmId == elem.firmId) == null) {
        list.add(it)
      } 
      if (list.size == 10) {
          return@forEach
      }
   }
   return list
}

是否有任何有效的解决方案让我获得最后10个不同的firmId?

提问于
用户回答回答于

使用@Query分页创建自定义,这将帮助你优化查询而不获取所有数据库行:

@Repository
public interface MoneyTransferRepository extends CrudRepository<MoneyTransfer, String> {

@Query("SELECT m.firmId FROM MoneyTransfer m WHERE m.customerId = :customerId ORDER BY m.id DESC")
List<String> findFirmIdsByCustomerId(@Param("customerId") String customerId, Pageable pageable);

}

但你仍然必须检查与输精管的结果firmId和检查输精管结果的大小firmIds,如果是小于10,则将再次对数据库和变更请求pagePageRequest

moneyTransferRepository.findFirmIdsByCustomerId(customerId, PageRequest.of(0, 10));
用户回答回答于

试试这个方法:

public interface MoneyTransferRepository extends JpaRepository<MoneyTransfer, Long> {

     MoneyTransfer findFirst10ByCustomerIdDesc(String customerId);

}

并在getList方法中对结果进行反向排序。

扫码关注云+社区

领取腾讯云代金券