我正在Spring Boot2和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,而不是所有的数据库行?
发布于 2018-08-02 01:41:15
如果您将Spring Data与Spring Boot一起使用,则可以创建一个SQL查询来仅检索所需的记录,并将其与@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-02 06:15:21
尝试这种方式(我不确定-现在无法测试)
public interface MoneyTransferRepository extends JpaRepository<MoneyTransfer, Long> {
MoneyTransfer findFirst10ByCustomerIdDesc(String customerId);
}
并在getList方法中对结果进行反向排序
发布于 2018-08-02 07:27:15
创建带分页的自定义@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);
}
但是你仍然需要用deferent firmId
检查结果,并检查deferent firmIds
的结果大小,如果它小于10,那么在你的例子中,你需要再次向数据库发出请求并在PageRequest
中更改page
moneyTransferRepository.findFirmIdsByCustomerId(customerId, PageRequest.of(0, 10));
附注:我也尝试过使用DISTINCT
,但它忽略了具有相同customerId
的所有重复firmId
https://stackoverflow.com/questions/51638908
复制相似问题