我希望用户能够在我的查询方法中指定限制(返回数量的大小)和偏移(返回的第一条记录/返回的索引)。
以下是我的类,没有任何分页功能。我的实体:
@Entity
public Employee {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
@Column(name="NAME")
private String name;
//getters and setters
}
我的存储库:
public interface EmployeeRepository extends JpaRepository<Employee, Integer> {
@Query("SELECT e FROM Employee e WHERE e.name LIKE :name ORDER BY e.id")
public List<Employee> findByName(@Param("name") String name);
}
我的服务界面:
public interface EmployeeService {
public List<Employee> findByName(String name);
}
我的服务实现:
public class EmployeeServiceImpl {
@Resource
EmployeeRepository repository;
@Override
public List<Employee> findByName(String name) {
return repository.findByName(name);
}
}
现在,我尝试提供支持偏移和限制的分页功能。我的实体类保持不变。
我的“new”存储库接受一个可分页参数:
public interface EmployeeRepository extends JpaRepository<Employee, Integer> {
@Query("SELECT e FROM Employee e WHERE e.name LIKE :name ORDER BY e.id")
public List<Employee> findByName(@Param("name") String name, Pageable pageable);
}
我的“新”服务接口接受两个附加参数:
public interface EmployeeService {
public List<Employee> findByName(String name, int offset, int limit);
}
我的“新”服务实施:
public class EmployeeServiceImpl {
@Resource
EmployeeRepository repository;
@Override
public List<Employee> findByName(String name, int offset, int limit) {
return repository.findByName(name, new PageRequest(offset, limit);
}
}
但是这不是我想要的。PageRequest指定页面和大小(页码和页面大小)。现在指定大小正是我想要的,但是,我不想指定起始页码,我希望用户能够指定起始记录/索引。我想要类似于
public List<Employee> findByName(String name, int offset, int limit) {
TypedQuery<Employee> query = entityManager.createQuery("SELECT e FROM Employee e WHERE e.name LIKE :name ORDER BY e.id", Employee.class);
query.setFirstResult(offset);
query.setMaxResults(limit);
return query.getResultList();
}
特别是setFirstResult()和setMaxResult()方法,但是我不能使用这个方法,因为我想使用Employee存储库接口(或者通过entityManager定义查询实际上更好?)
有没有不使用entityManager指定偏移量的方法?
8条答案
按热度按时间8hhllhi21#
下面的代码应该做到这一点。我正在使用我自己的项目和测试的大多数情况下。
用法:
和源代码:
vwhgwdsa2#
您可以通过创建自己的Pageable来实现这一点。
试试这个基本的例子。对我来说很好用:
rekjcdws3#
给你:
0tdrvxhp4#
也许答案有点晚了,但我想的是同样的事情。根据偏移量和限制计算当前页面。当然,这并不完全相同,因为它“假定”偏移量是限制的倍数,但也许您的应用程序适合这样做。
我会建议改变架构。改变你的控制器或任何调用服务的东西,如果可能的话,最初给予你页面和限制。
oewdyzsn5#
对于spring data jpa,您可能无法做到这一点。如果偏移量非常小,您可能只需要在检索后从查询中删除前X条语句。
否则,您可以将页面大小定义为偏移量并从page+1开始。
h5qlskok6#
使用long offset和**Sort.by()**修改good @codingmonkey awnser。
iqjalb3h7#
试试看:
k4emjkb18#
假设您正在同时进行过滤、排序和分页,下面的@Query将帮助您