Java Spring数据JPA分页-从方法名称创建查询
我在用户和电话号码之间有一个单一的关系。因此,一个用户可以有多个电话号码 在前端,我必须只提取登录用户的电话号码,或者如果用户是管理员,我必须显示所有用户的电话号码。我已经设法实现了这一部分,但我遇到的问题如下:在前端,用户还有一个“电话号码”搜索框。因此,如果用户或管理员搜索987(比如前3位数字),则应显示包含“987”且与其个人资料相关联的任何电话号码。如果用户是管理员,我应该显示包含“987”的所有用户的所有号码 出于分页目的,我使用Spring分页和排序存储库。到目前为止,我已经尝试过类似SQL的通配符Java Spring数据JPA分页-从方法名称创建查询,java,spring,jpa,pagination,spring-data-jpa,Java,Spring,Jpa,Pagination,Spring Data Jpa,我在用户和电话号码之间有一个单一的关系。因此,一个用户可以有多个电话号码 在前端,我必须只提取登录用户的电话号码,或者如果用户是管理员,我必须显示所有用户的电话号码。我已经设法实现了这一部分,但我遇到的问题如下:在前端,用户还有一个“电话号码”搜索框。因此,如果用户或管理员搜索987(比如前3位数字),则应显示包含“987”且与其个人资料相关联的任何电话号码。如果用户是管理员,我应该显示包含“987”的所有用户的所有号码 出于分页目的,我使用Spring分页和排序存储库。到目前为止,我已经尝试过
public interface UserRepository extends JpaRepository<User, Integer> {
//this is used for fetching phone numbers by userName, if user is admin I call findAll()
Page<User> findByUserName(String userName, Pageable pageable);
//this is used for fetching phone numbers by username by phoneNo LIKE
Page<User> findByUserNameAndPhoneNumbersPhoneNoLike(String userName,String phoneNo, Pageable pageable);
}
尝试包含关键字:
Containing
findByFirstnameContaining
… where x.firstname like ?1 (parameter bound wrapped in %)
Page<User> findByUserNameAndPhoneNumbersPhoneNoContaining(String userName,String phoneNo, Pageable pageable);
包含
FindByFirstName包含
…其中x.firstname类似于?1(参数绑定包装为%)
Page findByUserNameAndPhoneNumbersPhoneNoContaining(字符串用户名、字符串phoneNo、可分页);
文档:尝试包含关键字:
Containing
findByFirstnameContaining
… where x.firstname like ?1 (parameter bound wrapped in %)
Page<User> findByUserNameAndPhoneNumbersPhoneNoContaining(String userName,String phoneNo, Pageable pageable);
包含
FindByFirstName包含
…其中x.firstname类似于?1(参数绑定包装为%)
Page findByUserNameAndPhoneNumbersPhoneNoContaining(字符串用户名、字符串phoneNo、可分页);
文档:首先,不应允许客户端过滤数据。数据过滤逻辑应该在服务器端实现。因此,应重写默认findAll()以合并此行为,如下所示:
@Override
@Query(
"select p from User u join u.phoneNumbers p where "
+ "u.userId = ?#{@userService.getUserId()} or "
+ "?#{@userService.isAdmin()}"
)
Page findAll(Pageable pageable);
userService将具有如下通用结构-使用适当的逻辑填充函数:
@Service("userService")
@Transactional
public class UserServiceJPA {
public Integer getUserId(){
/**
* This function should return current logged in user's id from db
*/
}
public boolean isAdmin(){
/**
* This function should return true or false based on current logged in user
*/
}
}
这就完成了问题的第一部分。要按部分电话号码进行搜索,请使用以下代码
@Query(
"select p from PhoneNumber p where "
+ "("
+ " p.user.userId = ?#{@userService.getUserId()} or "
+ " ?#{@userService.isAdmin()} "
+ ") "
+ "and "
+ "p.phoneNo like :#{#partialPhone}%"
)
@RestResource(path="partialPhone")
Page findMatchingPhoneNumbers(
@Param("partialPhone")String partialPhone,
Pageable pageable);
首先,不应该允许客户端过滤数据。数据过滤逻辑应该在服务器端实现。因此,应重写默认findAll()以合并此行为,如下所示:
@Override
@Query(
"select p from User u join u.phoneNumbers p where "
+ "u.userId = ?#{@userService.getUserId()} or "
+ "?#{@userService.isAdmin()}"
)
Page findAll(Pageable pageable);
userService将具有如下通用结构-使用适当的逻辑填充函数:
@Service("userService")
@Transactional
public class UserServiceJPA {
public Integer getUserId(){
/**
* This function should return current logged in user's id from db
*/
}
public boolean isAdmin(){
/**
* This function should return true or false based on current logged in user
*/
}
}
这就完成了问题的第一部分。要按部分电话号码进行搜索,请使用以下代码
@Query(
"select p from PhoneNumber p where "
+ "("
+ " p.user.userId = ?#{@userService.getUserId()} or "
+ " ?#{@userService.isAdmin()} "
+ ") "
+ "and "
+ "p.phoneNo like :#{#partialPhone}%"
)
@RestResource(path="partialPhone")
Page findMatchingPhoneNumbers(
@Param("partialPhone")String partialPhone,
Pageable pageable);
你试过包含关键字吗?你试过包含关键字吗?