【问题标题】:LIKE Query in JPA using List of String - Spring使用字符串列表在 JPA 中进行 LIKE 查询 - Spring
【发布时间】:2021-05-11 22:40:06
【问题描述】:

已在 JPA 中为 %LIKE% SQL equal 使用了存储库中的包含方法,如下所示,

Page<Obj> findByNameContaining(String name, Pageable pageable);

如下所示,

select * from Obj where name like '%John%';

但是我如何传递List&lt;String&gt; 名称,这些名称将使用 JPA 进行如下查询,

select * from Obj where name like '%John%' or name like '%Jiva%' or name like 'etc' .....;

有什么 Spring JPA 方法可以解决这个问题吗?我也检查了规范类,这是这样做的唯一方法还是我错过了任何简单的方法或推荐任何其他动态查询?

【问题讨论】:

  • 也许这会有所帮助:stackoverflow.com/questions/52497673/…
  • @zappee 这个我已经看过了,它的 for IN 子句带有 SET 值。但我的要求是在具有 list 值的同一列中执行 %LIKE% 操作,以及我在问题中放置的 sql 的匹配查询。虽然 LIKE 和 IN 不一样
  • 也许this 一个,或者paragraph 9 of this guide 可以提供帮助。请检查它们。

标签: java sql spring hibernate spring-data-jpa


【解决方案1】:

最常用的 Spring Data JPA 方法是使用Specification,它为列表中的每个元素添加一个类似谓词。 你会这样称呼它

repository.findAll(containingOneOf(listOfNames))

Specification containingOneOf(List&lt;String&gt; listOfNames) 是你需要创建的方法。

有关 Spring Data JPA 中规范的更多详细信息,请参阅https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/

【讨论】:

    【解决方案2】:

    无法在存储库接口内创建具有多个 like 运算符的查询,但有一种解决方法可以使用 EntityManager 执行此操作。

    EntityManager 广泛用于SimpleJpaRepository。我们可以像这样使用@PersistenceContext 获取此类的实例:

    @PersistenceContext
    private EntityManager entityManager;
    

    并调用其方法.createQuery(QUERY).getResultList() 来执行数据库调用。对于分页,你可以检查这个Pagination using entity manager in spring

    要创建查询,您可以编写如下简单的逻辑:

    String createQuery(List<String> names){
        StringBuilder query = new StringBuilder("select e from Employee e where ");
        int size = names.size();
        for(int i = 0; i < size; i++){
            query.append("e.name like '%").append(names.get(i)).append("%'");
            if(i != size-1){
                query.append(" OR ");
            }
        }
        return query.toString();
    }
    

    在上面的代码中,Employee 是我的实体类,我正在为其创建一个带有多个 like 运算符的选择查询。

    完整代码:

    List<Employee> getEmployees(List<String> names){
        String query = createQuery(names);
        return entityManager.createQuery(query).getResultList();
    }
    

    【讨论】:

    • 在组装查询字符串时应该非常小心,因为它们容易受到 SQL 注入攻击。
    猜你喜欢
    • 2013-02-07
    • 1970-01-01
    • 2019-05-29
    • 2021-10-13
    • 1970-01-01
    • 2015-08-23
    • 2020-01-13
    • 1970-01-01
    • 2021-11-03
    相关资源
    最近更新 更多