我在User和PhoneNumber之间有一个OneToMany关系。因此,一个用户可以拥有多个电话号码。

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

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

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


问题在于,LIKE似乎不起作用。无论如何,它将返回与用户关联的所有电话号码,并且它将忽略我传递的任何内容,因此为“%987%”。因此,如果我有2个与用户X关联的电话号码(987123和321432),它将返回两个电话号码,而不是仅返回“ 987123”。

Doe的任何人都不知道我该如何查询它,但作为回报,可以获取Spring可分页对象?我认为从方法名称创建查询还不够强大,无法满足目的,但是我仍然需要可分页的对象,因为所有其余的实现都在前端,服务层基于此。工作中的某人建议我应该使用JPA标准,但是我不知道该怎么做,因此我可以得到可分页的对象

用户类别

@Entity
    @Table(name="USER")
    public class User implements Serializable{

        @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
        private Integer id;

        @NotEmpty
        @Column(name="USER_ID", unique=true, nullable=false)
        private String userName;

        @OneToMany(fetch = FetchType.EAGER)
        @JoinColumn(name="USER_ID")
        private Set<PhoneNumer> phoneNumbers;

        @NotEmpty
        @JsonIgnore
        @ManyToMany(fetch = FetchType.LAZY)
        @JoinTable(name = "USER_USER_PROFILE",
                joinColumns = { @JoinColumn(name = "USER_ID") },
                inverseJoinColumns = { @JoinColumn(name = "USER_PROFILE_ID") })
        private Set<UserProfile> userProfiles = new HashSet<UserProfile>();
        //Getters and Setters


电话号码类别

@Entity
@Table(name = "PHONE_NUMBER")
public class PhoneNumber {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private long id;

    @Column(name = "PHONE_NUMBER")
    private String phoneNo;
    //Getters and Setters

最佳答案

尝试包含关键字:

Containing
findByFirstnameContaining
… where x.firstname like ?1 (parameter bound wrapped in %)

Page<User> findByUserNameAndPhoneNumbersPhoneNoContaining(String userName,String phoneNo, Pageable pageable);


文件:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repository-query-keywords

07-26 09:43