hibernate - 带有分页的 Spring JPA 存储库中的自定义查询

标签 hibernate spring-mvc spring-boot spring-data-jpa data-paging

我尝试使用 Spring Boot 实现 JPA 存储库,它工作正常。
现在,如果我尝试在使用@Query Annotation 扩展 JpaRepository 的接口(interface)中实现自定义查询,它可以正常返回 bean 列表。(使用 NamedQuery)。
现在,当我尝试将分页用于自定义方法/查询时,它不起作用。

代码 :

Controller :

@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>

Exception : java.lang.IllegalArgumentException: Type specified for TypedQuery [java.lang.Long] is incompatible with query return type [class com.mobicule.SpringBootJPADemo.beans.Employee]



我只想让 Spring JPA Repository 为自定义方法和查询提供分页功能。
我怎样才能做到这一点?

最佳答案

我不知道为什么,但出于某种原因只是在做 from Entity导致返回“id”,而您需要提供选择中返回的实体,例如 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 文件中。 here's my full code

进一步测试表明 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" ) );
}

关于hibernate - 带有分页的 Spring JPA 存储库中的自定义查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31857491/

相关文章:

java - Spring + hibernate + HikariCP : how to handle DB connection while doing long running REST call?

java - 在 Spring Boot 中从文件加载 SQL 触发器

java - 生产环境: Spring security login success redirect to localhost

java - spring mvc 表单输入

java - 如何使用 typedQuery 在 Criteria api 上添加分页?

hibernate - Spring Batch - 模块化批处理范围规则

java - 之后我可以用 hibernate 替换 JDBC 逻辑吗

java - 如何解决无限递归(org.codehaus.jackson.map.JsonMappingException)

java - 限制 REST API 的 JSON 响应中的字段?

java - 对目录结构有点困惑