【问题标题】:How to write JpaRepository method for searching Users that have phone number stored in Set<String>如何编写 JpaRepository 方法来搜索在 Set<String> 中存储电话号码的用户
【发布时间】:2019-05-09 19:22:48
【问题描述】:

我正在做一个 Spring 项目,现在我必须编写 JPA 方法来搜索在 Set 中有电话号码 LIKE 的用户

方法应该在我实现JpaRepository的接口UserRepository中

我试过写这样的方法:
List&lt;User&gt; findByNameLikeOrPhoneNumbersLike(String name, Set&lt;String&gt; phoneNumbers);
List&lt;User&gt; findByNameLikeOrPhoneNumbersLike(String name, String phoneNumber);
List&lt;User&gt; findByNameLikeOrPhoneNumbersContaining(String name, String phoneNumber);

但它们都不起作用。

我的用户实体类是:

@Entity
public class User  {
@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long id;

 @Convert(converter = PhoneNumbersConverter.class)
    public Set<String> phoneNumbers = new TreeSet<>();

........
}

目前我的 PhoneNumbersConverter 将列表转换为使用“,”连接的字符串

我想编写一种方法,可以在给定字符串上搜索我的用户,该字符串可能是 LIKE 名称,也可能是 LIKE 用户编号之一。

【问题讨论】:

    标签: java spring hibernate jpa repository


    【解决方案1】:

    如果你可以使用nativeQuery@Query,你可以这样做(假设列名是namephone_numbers 并且phone_numbers 看起来像这样111222333,222333444,333444555)。

    @Query(value = 
      "SELECT _user FROM user _user " +
      "WHERE " +
        "_user.name LIKE CONCAT('%', $1, '%') OR " +
        "_user.phone_numbers LIKE CONCAT('%', $1, '%')",
    nativeQuery = true
    )
    List<User> findWhereNameOrPhoneNumberLike(String query);
    

    您可能还想对query_user.name 使用UPPER 函数以不区分大小写(UPPER(_user.name) LIKE UPPER(CONCAT('%', $1, '%')))。

    【讨论】:

    • 我已经尝试过,但查询验证有例外。在我将 nativeQuery 设置为 true 并且我对 sql 有异常后,因为 user.phoneNumbers 不是表。我的转换将其保存在用户表中作为连接字符串
    • @Bojmaliev 我已经编辑了我的答案并发布了本机查询对于这种类型的映射的外观。当然细节取决于您使用的数据库,但请尝试一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多