JPARepository Spring Boot中的LIKE + OR MySQL操作

时间:2019-01-23 10:40:04

标签: hibernate spring-boot jpa spring-data-jpa spring-data

我需要从具有select * from table where (name LIKE '%xxx%' OR name LIKE '%yyy%' OR name LIKE '%xy%')

这样的条件的表中获取数据

我编写的JPA存储库类就像

public List<Object> findByNameContaining(String[] name);

始终返回null, 但是当我只传递一个字符串作为参数时,我得到了响应,

public List<Object> findByNameContaining("xxx");

如何在findByNameContaining()方法的参数中传递对象列表。

下面是我引用的链接,该链接仅在参数中使用单个字符串对象

How to find multiple like in JpaRepository Spring

%Like% Query in spring JpaRepository

2 个答案:

答案 0 :(得分:0)

您使用本机查询

import com.example.entity.Foo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface FooRepository extends JpaRepository<Foo, Integer> {

    @Query(value = "SELECT * FROM Foo WHERE (name LIKE '%xxx%' OR name LIKE '%yyy%' OR name LIKE '%xy%'))", nativeQuery = true)
    List<Foo> getListOfFoo();

}

答案 1 :(得分:0)

如果我没记错的话,就不可能有like in (a, b, c)这样的查询。在您的情况下,您将不得不执行以下操作:

 @Query("select m from MyEntity m where m.name like ?1 or m.name like ?2 or m.name like ?3")
 List<MyEntity> findByNameContaining(String match1, String match2, String match3);

但是,如果您期望有like ...子句的动态列表,那么这是相当有限的。

或者,您可以使用规范:

public static Specification<MyEntity> findByNameContaining(List<String> matches) {
    return (root, query, cb) -> cb.or(matches
        .stream()
        .map(match -> cb.like(root.get("name"), match))
        .toArray(Predicate[]::new));
}

在这种情况下,您必须确保您的存储库扩展了JpaSpecificationExecutor接口,然后您可以这样调用它:

repository.findAll(findByNameContaining(..));