Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring数据JPA分页-从方法名称创建查询_Java_Spring_Jpa_Pagination_Spring Data Jpa - Fatal编程技术网

Java Spring数据JPA分页-从方法名称创建查询

Java Spring数据JPA分页-从方法名称创建查询,java,spring,jpa,pagination,spring-data-jpa,Java,Spring,Jpa,Pagination,Spring Data Jpa,我在用户和电话号码之间有一个单一的关系。因此,一个用户可以有多个电话号码 在前端,我必须只提取登录用户的电话号码,或者如果用户是管理员,我必须显示所有用户的电话号码。我已经设法实现了这一部分,但我遇到的问题如下:在前端,用户还有一个“电话号码”搜索框。因此,如果用户或管理员搜索987(比如前3位数字),则应显示包含“987”且与其个人资料相关联的任何电话号码。如果用户是管理员,我应该显示包含“987”的所有用户的所有号码 出于分页目的,我使用Spring分页和排序存储库。到目前为止,我已经尝试过

我在用户和电话号码之间有一个单一的关系。因此,一个用户可以有多个电话号码

在前端,我必须只提取登录用户的电话号码,或者如果用户是管理员,我必须显示所有用户的电话号码。我已经设法实现了这一部分,但我遇到的问题如下:在前端,用户还有一个“电话号码”搜索框。因此,如果用户或管理员搜索987(比如前3位数字),则应显示包含“987”且与其个人资料相关联的任何电话号码。如果用户是管理员,我应该显示包含“987”的所有用户的所有号码

出于分页目的,我使用Spring分页和排序存储库。到目前为止,我已经尝试过类似SQL的通配符

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

你试过包含关键字吗?你试过包含关键字吗?