我需要从具有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()
方法的参数中传递对象列表。
下面是我引用的链接,该链接仅在参数中使用单个字符串对象
答案 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(..));