首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Croud Repository中找到最后10个具体列不同的实体?

如何在Croud Repository中找到最后10个具体列不同的实体?
EN

Stack Overflow用户
提问于 2018-08-02 01:15:47
回答 3查看 70关注 0票数 0

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

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

我需要得到最后10个不同的公司,客户转账。

目前,我获取用户所有的转账并对其进行过滤。然而,这种方法没有意义,因为我让数据库中的所有元素查找最后10个元素。它可能会导致性能问题。

代码语言:javascript
复制
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,而不是所有的数据库行?

EN

回答 3

Stack Overflow用户

发布于 2018-08-02 01:41:15

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

例如:

代码语言:javascript
复制
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

票数 0
EN

Stack Overflow用户

发布于 2018-08-02 06:15:21

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

代码语言:javascript
复制
public interface MoneyTransferRepository extends JpaRepository<MoneyTransfer, Long> {

     MoneyTransfer findFirst10ByCustomerIdDesc(String customerId);

}

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

票数 0
EN

Stack Overflow用户

发布于 2018-08-02 07:27:15

创建带分页的自定义@Query,这将帮助您在不获取所有数据库行的情况下优化查询

代码语言:javascript
复制
@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);

}

但是你仍然需要用deferent firmId检查结果,并检查deferent firmIds的结果大小,如果它小于10,那么在你的例子中,你需要再次向数据库发出请求并在PageRequest中更改page

代码语言:javascript
复制
moneyTransferRepository.findFirmIdsByCustomerId(customerId, PageRequest.of(0, 10));

附注:我也尝试过使用DISTINCT,但它忽略了具有相同customerId的所有重复firmId

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51638908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档