【发布时间】:2015-10-29 16:53:32
【问题描述】:
我已经尝试使用 Spring Boot 实现 JPA 存储库,它工作正常。 现在,如果我尝试在使用@Query Annotation 扩展 JpaRepository 的接口中实现自定义查询,它可以正常返回 bean 列表。(使用 NamedQuery)。 现在,当我尝试将分页用于自定义方法/查询时,它不起作用。
代码:
控制器:
@RequestMapping("/custompages/{pageNumber}")
public String getAllEmployeesUsingNamedQueryWithPaging(@PathVariable Integer pageNumber,Model model)
{
Page<Employee> page = employeeService.getAllEmployeesUsingNamedQueryWithPaging(pageNumber);
System.out.println("current page "+page);
System.out.println("current page content"+page.getContent());
int current = page.getNumber() + 1;
int begin = Math.max(1, current - 5);
int end = Math.min(begin + 10, page.getTotalPages());
model.addAttribute("empList", page.getContent());
model.addAttribute("empPages", page);
model.addAttribute("beginIndex", begin);
model.addAttribute("endIndex", end);
model.addAttribute("currentIndex", current);
return "employeeWorkbench";
}
服务
@Override
public Page<Employee> getAllEmployeesUsingNamedQueryWithPaging(Integer
pageNumber) {
PageRequest pageRequest =
new PageRequest(pageNumber - 1, PAGE_SIZE,
Sort.Direction.ASC, "id");
return
employeeDao.getAllEmployeesUsingNamedQueryWithPaging(pageRequest);
}
道
@Transactional
public interface EmployeeDao extends JpaRepository<Employee, Long>{
@Query(name="HQL_GET_ALL_EMPLOYEE_BY_ID")//Works Fine
public List<Employee> getEmpByIdUsingNamedQuery(@Param("empId") Long
empId);
@Query(name="HQL_GET_ALL_EMPLOYEE") //throws exception
public Page<Employee> getAllEmployeesUsingNamedQueryWithPaging(Pageable
pageable);
}
命名查询
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD
3.0//EN"
"http://hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<query name="HQL_GET_ALL_EMPLOYEE">from Employee</query>
<query name="HQL_GET_ALL_EMPLOYEE_BY_ID">from Employee where id =
:empId</query>
</hibernate-mapping>
异常:java.lang.IllegalArgumentException:指定的类型 TypedQuery [java.lang.Long] 与查询返回类型不兼容 [类 com.mobicule.SpringBootJPADemo.beans.Employee]
我只想让 Spring JPA Repository 为自定义方法和查询提供分页功能。 我怎样才能做到这一点?
【问题讨论】:
-
如果不是在 xml 中使用命名查询,而是将查询直接放在
@Query("from Employee")中,它会改变行为吗?存储库上的 @Transactional 也是多余的。同样对于这么简单的查询,您最好只使用存储库已有的findAll。 -
这个错误也暗示由于某种原因(对我来说并不明显)它认为指定的查询应该返回一个 Long 而不是Employees
-
@xenoterracide :感谢您的回复。我尝试使用简单的 @Query("from Employee") 但这将返回 List
而不是 Page 。我的动机是使用 JpaRepositories 为我的自定义查询构建分页功能。正如你所说,我使用 findAll 可以正常工作,没有任何问题,甚至可以很好地用于分页。但我也希望我的自定义查询具有相同的功能。 -
我已经搜索了这个查询,我知道当 JpaRepository 执行它的方法 findAll,findBy......etc 并进行分页时,它会运行 2 个查询 --- 一个用于计数,另一个用于实际数据.
-
是的,计数是故意的......所以它知道它有多少页。如果返回类型指定为
Page<Employee>,则不应获取List,只有在请求List或List的子接口(例如Iterable)时才应获取List
标签: hibernate spring-mvc spring-boot spring-data-jpa data-paging