【问题标题】:JPA sorting query result after querying with Pageable使用Pageable查询后的JPA排序查询结果
【发布时间】:2020-09-19 00:52:14
【问题描述】:

我有一个这样的@Entity:

import java.time.LocalDateTime;
import javax.persistence.Entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.jpa.domain.AbstractPersistable;

@Entity
@Data@NoArgsConstructor@AllArgsConstructor
public class Message extends AbstractPersistable<Long> {

    private LocalDateTime messageDate = LocalDateTime.now();
    private String message;

}

还有一个像这样的存储库:

import java.util.List;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;

public interface MessageRepository extends JpaRepository<Message, Long> {
    //List<Message> findAllByOrderByMessageDateAsc(Pageable pageable);
    // With this I am trying to re-sort what I get

}

还有一个@Controller

@GetMapping("/messages")
    public String list(Model model) {
        Pageable limit = PageRequest.of(0, 5, Sort.by("messageDate").descending());
        model.addAttribute("messages", messageRepository.findAll(limit));
        //model.addAttribute("messages", messageRepository.findAllByOrderByMessageDateAsc(limit));
        return "messages";
    }

我收到了 5 条按降序排列的最新消息。但是如何让它们按升序排列?

【问题讨论】:

  • 使用 Sort.by("messageDate").ascending()
  • 如果我代替 PageRequest.of(0, 5, Sort.by("messageDate").descending()) 使用 PageRequest.of(0, 5, Sort.by("messageDate") .ascending()) 我收到最旧的五条消息。我想要最新的五个按升序排列。
  • 您需要的是按按摩日期的最后 5 条消息。最简单的方法是进行计数查询然后再次请求,或者您必须在获取后手动排序
  • 我试过 long count = messageRepository.count();可分页限制 = PageRequest.of((int)count/5, 5, Sort.by("messageDate").ascending());它不会一直给出五条记录。抓取后如何排序?
  • 我添加了一个答案希望它可以帮助你。

标签: spring-boot jpa


【解决方案1】:

您需要的是按按摩日期升序排列的最后 5 条消息。 两种解决方法。

使用Pageable的自定义实现

您不能为PageRequest 正确使用偏移量。所以, 您需要使用Pageable 的自定义实现进行偏移。 您可以使用自定义实现OffsetBasedPageRequest。那就这样用吧。

int totalCount = (int)serviceRepository.count();
Pageable pageable = new OffsetBasedPageRequest(totalCount - limit, limit, Sort.by("messageDate"));
messageRepository.findAll(pageable);

获取排序页面数据后

您可以使用page.getContent()Page&lt;T&gt; 获取列表,然后手动对列表进行排序。

Pageable pageable = PageRequest.of(0, limit, Sort.by("messageDate").descending());
List<Message> list = messageRepository.findAll(pageable ).getContent();
List<Message> sorted =list.stream().sorted(Comparator.comparing(r -> r.getMessageDate())).collect(Collectors.toList());

如果你愿意,你必须再次创建Page&lt;Massage&gt;

【讨论】:

  • 谢谢。那并不完全奏效。此 list.sort(Comparator.comparing(a -> a.getMessageDate())) 上的错误;但这有效 List content = messageRepository.findAll(limit).getContent() .stream().sorted(Comparator.comparing(r -> r.getMessageDate())).collect(Collectors.toList());
  • 随心所欲地更新
  • 可能是因为 list 不是不可变的 list.sort(Comparator.comparing(a -> a.getMessageDate()));应该工作
猜你喜欢
  • 2017-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 2015-11-06
  • 1970-01-01
相关资源
最近更新 更多