Spring boot 使用Pageable查询后的JPA排序查询结果
我有一个像这样的@实体:Spring boot 使用Pageable查询后的JPA排序查询结果,spring-boot,jpa,Spring Boot,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@NoArgs
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
}
我收到五条最新消息,按降序排列。但是,我如何按升序获取它们呢?您需要的是按按摩日期升序的最后5条消息。 有两种解决方法 使用可分页的
的自定义实现
无法为PageRequest
正确使用偏移量。所以
对于偏移量,需要使用Pageable
的自定义实现。
您可以使用自定义实现。那就这样用吧
int totalCount = (int)serviceRepository.count();
Pageable pageable = new OffsetBasedPageRequest(totalCount - limit, limit, Sort.by("messageDate"));
messageRepository.findAll(pageable);
获取排序页面数据后
您可以使用Page.getContent()
从Page
获取列表,然后手动对列表进行排序
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());
Pageable Pageable=PageRequest.of(0,limit,Sort.by(“messageDate”).descending());
List=messageRepository.findAll(可分页).getContent();
List sorted=List.stream().sorted(Comparator.comparing(r->r.getMessageDate()).collect(Collectors.toList());
如果需要,您还必须创建页面。您需要的是按按摩日期升序排列的最后5条消息。
有两种解决方法
使用可分页的的自定义实现
无法为PageRequest
正确使用偏移量。所以
对于偏移量,需要使用Pageable
的自定义实现。
您可以使用自定义实现。那就这样用吧
int totalCount = (int)serviceRepository.count();
Pageable pageable = new OffsetBasedPageRequest(totalCount - limit, limit, Sort.by("messageDate"));
messageRepository.findAll(pageable);
获取排序页面数据后
您可以使用Page.getContent()
从Page
获取列表,然后手动对列表进行排序
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());
Pageable Pageable=PageRequest.of(0,limit,Sort.by(“messageDate”).descending());
List=messageRepository.findAll(可分页).getContent();
List sorted=List.stream().sorted(Comparator.comparing(r->r.getMessageDate()).collect(Collectors.toList());
然后,如果需要,您必须再次创建Page
。使用Sort.by(“messageDate”)。如果我不使用PageRequest,则使用升序()。of(0,5,Sort.by(“messageDate”)。downsing()使用PageRequest。of(0,5,Sort.by(“messageDate”)。升序()我得到最早的五条消息。我要按升序排列最晚5条。你需要的是按摩日期前最后5条信息。最简单的方法是执行计数查询,然后再次请求,或者在获取后必须手动排序。我尝试了long count=messageRepository.count();Pageable limit=PageRequest.of((int)count/5,5,Sort.by(“messageDate”).ascending();它并不总是给出五条记录。获取后如何排序?我添加了一个答案,希望对您有所帮助。如果我不使用PageRequest,请使用sort.by(“messageDate”).ascending()。of(0,5,sort.by(“messageDate”).descending())使用PageRequest。of(0,5,sort.by(“messageDate”).ascending())我获取最早的五条消息。我要按升序排列最晚5条。你需要的是按摩日期前最后5条信息。最简单的方法是执行计数查询,然后再次请求,或者在获取后必须手动排序。我尝试了long count=messageRepository.count();Pageable limit=PageRequest.of((int)count/5,5,Sort.by(“messageDate”).ascending();它并不总是给出五条记录。获取后如何排序?我添加了一个答案,希望对您有所帮助。谢谢。那不太管用。此列表上出现错误。排序(Comparator.comparing(a->a.getMessageDate());但是这个工作列表content=messageRepository.findAll(limit).getContent().stream().sorted(Comparator.comparing(r->r.getMessageDate()).collect(Collectors.toList());根据需要进行更新可能是因为list是不可变的list.sort(Comparator.comparing(a->a.getMessageDate());应该谢谢你。那不太管用。此列表上出现错误。排序(Comparator.comparing(a->a.getMessageDate());但是这个工作列表content=messageRepository.findAll(limit).getContent().stream().sorted(Comparator.comparing(r->r.getMessageDate()).collect(Collectors.toList());根据需要进行更新可能是因为list是不可变的list.sort(Comparator.comparing(a->a.getMessageDate());应该有用