spring列表的jpa类java查询

pftdvrlh  于 2021-07-23  发布在  Java
关注(0)|答案(3)|浏览(334)

在存储库中为%like%sql equal使用了containing方法,如下所示,

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

工作原理如下,

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

但是我怎么通过考试呢 List<String> 使用jpa查询如下所示的名称,

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

有什么办法吗?我还检查了规范类,这是做这件事的唯一方法还是我遗漏了任何简单的方法或任何其他建议的动态查询?

gkn4icbw

gkn4icbw1#

spring数据jpa最常用的方法是使用 Specification 它为列表中的每个元素添加一个like predicate 。你会这么说吗

repository.findAll(containingOneOf(listOfNames))

Specification containingOneOf(List<String> listOfNames) 是您需要创建的方法。
看到了吗https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/ 关于springdatajpa中规范的更多细节。

c0vxltue

c0vxltue2#

无法创建具有多个 like 操作员在存储库界面中,但有一个解决方法可以使用 EntityManager . EntityManager 在simplejparepository中广泛使用。我们可以使用 @PersistenceContext 这样地:

@PersistenceContext
private EntityManager entityManager;

并调用其方法 .createQuery(QUERY).getResultList() 执行数据库调用。对于分页,您可以在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();
}
6bc51xsx

6bc51xsx3#

如果您使用的是sql server/oracle,则可以在where子句中使用contains函数。
oracle:where contains(列名称' or pqr or xyz',1)>0 sql server:where contains(列名称''or'pqr'or'xyz*')

另一种方法是在where子句中使用正则表达式。
不同的数据库支持不同的正则表达式函数,如regexp\u like、regex\u contains等

相关问题