Awa*_*ing 54 java spring hibernate jpa spring-data-jpa
我正在使用Spring Data JPA,当我@Query用来定义查询WITHOUT时 Pageable,它可以工作:
public interface UrnMappingRepository extends JpaRepository<UrnMapping, Long> {
@Query(value = "select * from internal_uddi where urn like %?1% or contact like %?1%",
nativeQuery = true)
List<UrnMapping> fullTextSearch(String text);
}
Run Code Online (Sandbox Code Playgroud)
但是如果我添加第二个参数Pageable,那么@Query它将不起作用,Spring将解析方法的名称,然后抛出异常 No property full found.这是一个错误吗?
public interface UrnMappingRepository extends JpaRepository<UrnMapping, Long> {
@Query(value = "select * from internal_uddi where urn like %?1% or contact like %?1%",
nativeQuery = true)
Page<UrnMapping> fullTextSearch(String text, Pageable pageable);
}
Run Code Online (Sandbox Code Playgroud)
Rem*_*usS 38
您可以对本机查询使用分页.它在此处记录:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#_native_queries
" 但是,您可以通过自己指定计数查询来使用本机查询进行分页:示例59.使用@Query在查询方法中声明分页的本机计数查询 "
public interface UserRepository extends JpaRepository<User, Long> {
@Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1",
countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1",
nativeQuery = true)
Page<User> findByLastname(String lastname, Pageable pageable);
}
Run Code Online (Sandbox Code Playgroud)
Ste*_*eve 30
在Spring论坛上提出了类似的问题,其中指出要应用分页,必须派生第二个子查询.由于子查询引用相同的字段,因此需要确保查询对其引用的实体/表使用别名.这意味着你写的地方:
select * from internal_uddi where urn like
Run Code Online (Sandbox Code Playgroud)
你应该改为:
select * from internal_uddi iu where iu.urn like ...
Run Code Online (Sandbox Code Playgroud)
考虑到UrnMapping类被映射到internal_uddi表,我会建议:
@Repository
public interface UrnMappingRepository extends JpaRepository<UrnMapping, Long> {
@Query(value = "select iu from UrnMapping iu where iu.urn like %:text% or iu.contact like %:text%")
Page<UrnMapping> fullTextSearch(@Param("text") String text, Pageable pageable);
}
Run Code Online (Sandbox Code Playgroud)
请注意,您可能必须使用动态请求关闭本机查询.
如果您使用 Spring Data JPA 2.0.4 及更高版本,请参考:Spring Data JPA @Query 。示例如下:
@Query(value = "SELECT u FROM User u ORDER BY id")
Page<User> findAllUsersWithPagination(Pageable pageable);
Run Code Online (Sandbox Code Playgroud)
小智 5
使用 @Query ,我们也可以在需要在 JPA 方法结束时传递Pageable类的对象的地方使用分页
例如:
Pageable pageableRequest = new PageRequest(page, size, Sort.Direction.DESC, rollNo);
Run Code Online (Sandbox Code Playgroud)
其中,页面 = 页面索引(索引从零开始)
大小 = 记录数
Sort.Direction = 按 rollNo 排序
rollNo = 用户类中的字段
UserRepository repo
repo.findByFirstname("John", pageableRequest);
public interface UserRepository extends JpaRepository<User, Long> {
@Query(value = "SELECT * FROM USER WHERE FIRSTNAME = :firstname)
Page<User> findByLastname(@Param("firstname") String firstname, Pageable pageable);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
73373 次 |
| 最近记录: |