在Spring JpaRepository中的%Like%查询


110

我想写一个类似的查询,JpaRepository但它不返回任何内容:

LIKE '%place%'-它不起作用。

LIKE 'place' 完美地工作。

这是我的代码:

@Repository("registerUserRepository")
public interface RegisterUserRepository extendsJpaRepository<Registration,Long> {

    @Query("Select c from Registration c where c.place like :place")
     List<Registration> findByPlaceContaining(@Param("place")String place);
}

Answers:


199

spring数据JPA查询需要“%”字符以及like查询中的空格字符,如

@Query("Select c from Registration c where c.place like %:place%")

cf. http://docs.spring.io/spring-data/jpa/docs/current/reference/html

您可能希望完全摆脱@Query注释,因为它似乎类似于标准查询(由spring数据代理自动实现);即使用单行

List<Registration> findByPlaceContaining(String place);

足够了。


23
使用以下命令忽略查询的大小写也可能很有用:findByPlaceIgnoreCaseContaining(String place);
ilyailya

只是附带说明-您不能在同一查询中混合和匹配%:param%与%param%。否则,该应用程序甚至无法启动。
RVP

谢谢。我以前用like '%:place%'with 编写过',根本没有结果,因为Hibernate '本身将s 添加到字符串中。
Yamashiro Rion

这不是一个好的回应,也有潜在的危险。Spring已经用ContainingIgnoreCase解决了这个问题,请检查下面的答案。
Alexius DIAKOGIANNIS

99

您实际上根本不需要@Query注释。

您可以使用以下内容

    @Repository("registerUserRepository")
    public interface RegisterUserRepository extends JpaRepository<Registration,Long>{

    List<Registration> findByPlaceIgnoreCaseContaining(String place);

    }

对我来说,这是最好的解决方案。我不知道您可以将IgnoreCase与Containing结合使用,它不在文档中。
威尔逊·卡萨帕诺

1
如果我想使用许多列怎么办?-我相信这@Query()是必须的,对吗?使用这种方法,我将不得不使它or实际上不是那种情况下的合适解决方案:findByField1OrField2Containg(String phraseForField1, String phraseForField2)
user3529850


20

对于您的情况,可以直接使用JPA方法。就像下面这样:

包含:选择...,例如%:place%

List<Registration> findByPlaceContainingIgnoreCase(String place);

在这里,IgnoreCase将帮助您在不区分大小写的情况下搜索项目。

在JPQL中使用@Query

@Query("Select registration from Registration registration where 
registration.place LIKE  %?1%")
List<Registration> findByPlaceContainingIgnoreCase(String place);

以下是一些相关方法:

  1. 喜欢 findByPlaceLike

    …其中x.place像?1

  2. 从...开始 findByPlaceStartingWith

    …其中x.place像?1(参数附加了%)

  3. 结尾于 findByPlaceEndingWith

    …其中x.place类似于?1(参数与前缀%绑定)

  4. 内含 findByPlaceContaining

    …其中x.place像?1(参数绑定包裹在%中)

更多信息,请查看此链接此链接以及

希望这个能对您有所帮助 :)


6

您可以使用占位符的一种替代方法:

@Query("Select c from Registration c where c.place LIKE  %?1%")
List<Registration> findPlaceContainingKeywordAnywhere(String place);

4

试试这个。

@Query("Select c from Registration c where c.place like '%'||:place||'%'")

如果我们在查询中使用something=:place和有帮助another like %:place%
hong4rc

1

当通话功能时,我使用: findByPlaceContaining("%" + place);

要么: findByPlaceContaining(place + "%");

要么: findByPlaceContaining("%" + place + "%");



0

找到了没有解决方案@Query(实际上,我尝试了“接受”的解决方案。但是,它没有用)。

必须返回Page<Entity>而不是List<Entity>

public interface EmployeeRepository 
                          extends PagingAndSortingRepository<Employee, Integer> {
    Page<Employee> findAllByNameIgnoreCaseStartsWith(String name, Pageable pageable);
}

IgnoreCase 对于实现这一目标至关重要!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.