0

我正在 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 个不同的公司 ID?

4

3 回答 3

0

如果您将 Spring Data 与 Spring Boot 一起使用,则可以创建一个 SQL Query 以仅检索您想要的记录并将其与 @Query 注释一起使用。

例如:

public interface UserRepository extends JpaRepository<User, Long> {

     @Query("select u from User u where u.emailAddress = ?1")
     User findByEmailAddress(String emailAddress);

}

此处的文档:https ://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.at-query

于 2018-08-01T17:41:14.927 回答
0

试试这种方式(我不确定 - 现在无法测试)

public interface MoneyTransferRepository extends JpaRepository<MoneyTransfer, Long> {

     MoneyTransfer findFirst10ByCustomerIdDesc(String customerId);

}

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

于 2018-08-01T22:15:20.660 回答
0

使用分页创建自定义@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);

}

但是您仍然必须使用 deferentfirmId检查结果并检查 deferent 的结果大小firmIds,如果它小于 10,那么在您的情况下,您将再次向数据库发出请求并page更改PageRequest

moneyTransferRepository.findFirmIdsByCustomerId(customerId, PageRequest.of(0, 10));

PS我也试过这个,DISTINCT但它忽略了所有重复firmId的相同customerId

于 2018-08-01T23:27:14.623 回答