具有分页功能的Spring JPA存储库中的自定义查询

我尝试用Spring Boot" title="Spring Boot">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

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 f也可行,我不知道为什么需要别名,也许它是JPQL规范的一部分。

这是一个测试,显示如何进行简单的分页,按一个属性排序和按多个属性排序

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

}

以上是 具有分页功能的Spring JPA存储库中的自定义查询 的全部内容, 来源链接: utcz.com/qa/404792.html

回到顶部