我尝试用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]指定的类型与查询返回类型[class com.mobicule.SpringBootJPADemo.beans.Employee]不兼容
我只想拥有Spring JPA存储库提供的用于自定义方法和查询的分页功能。我该如何实现?
我不确定为什么,但是由于某种原因,简单地from Entity导致返回“ id”,而是需要提供select中返回的实体,例如select f from Foo f
from Entity
select f from Foo f
public interface FooRepo extends PagingAndSortingRepository<Foo, Long> { @Query( "select f from Foo f" ) Page<Foo> findAllCustom( Pageable pageable ); Page<Foo> findAllByBarBazContaining( String baz, Pageable pageable ); }
我收到了同样的错误,只是from Foo。我也相信您可以像以前一样通过名称将其引用到xml文件。这是我的完整代码
from Foo
进一步的测试表明它from Foo f也可行,我不知道为什么需要别名,也许它是JPQL规范的一部分。
from Foo f
这是一个测试,显示如何进行简单的分页,按一个属性排序和按多个属性排序
@Test public void testFindAllCustom() throws Exception { Page<Foo> allCustom = fooRepo.findAllCustom( pageable ); assertThat( allCustom.getSize(), is( 2 ) ); Page<Foo> sortByBazAsc = fooRepo.findAllCustom( new PageRequest( 0, 2, Sort.Direction.ASC, "bar.baz" ) ); assertThat( sortByBazAsc.iterator().next().getBar().getBaz(), is( "2baz2bfoo" ) ); Page<Foo> complexSort = fooRepo.findAllCustom( new PageRequest( 0, 2, new Sort( new Sort.Order( Sort.Direction.DESC, "bar.baz" ), new Sort.Order( Sort.Direction.ASC, "id" ) ) ) ); assertThat( complexSort.iterator().next().getBar().getBaz(), is( "baz1" ) ); }