提问者:小点点

用分页查询后的JPA排序查询结果


我有一个这样的@实体:

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

}

和一个控制器

@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";
    }

我按降序收到五条最新消息。但是我如何按升序获取它们?


共1个答案

匿名用户

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

使用可分页的自定义实现

您无法正确使用PageRequest的偏移量。因此,您需要使用Pagable的自定义实现来进行偏移。您可以使用自定义实现OffsetBasedPageRequest。然后这样使用它。

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

获取排序页数据后

您可以从页面获取列表

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());

然后你必须再次创建页面