%Like Spring JpaRepository中的%Query

时间:2014-08-18 11:44:55

标签: java jpa spring-data-jpa

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

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

LIKE 'place'效果很好。

这是我的代码:

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

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

11 个答案:

答案 0 :(得分:148)

spring数据JPA查询需要&#34;%&#34; chars以及查询中like后面的空格字符,如

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

比照。 http://docs.spring.io/spring-data/jpa/docs/current/reference/html

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

List<Registration> findByPlaceContaining(String place);

就足够了。

答案 1 :(得分:74)

您根本不需要@Query注释。

您可以使用以下

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

    List<Registration> findByPlaceIgnoreCaseContaining(String place);

    }

答案 2 :(得分:19)

您还可以使用Spring Data JPA支持的关键字"Containing"来实现类似的查询。

List<Registration> findByPlaceContaining(String place);

答案 3 :(得分:11)

对于您的情况,可以直接使用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(参数绑定在%中)

更多信息,查看this linkthis linkthis

希望这会对您有所帮助:)

答案 4 :(得分:5)

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

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

答案 5 :(得分:1)

当打电话时,我使用: findByPlaceContaining("%" + place);

或: findByPlaceContaining(place + "%");

或: findByPlaceContaining("%" + place + "%");

答案 6 :(得分:1)

答案确切

-->` @Query("select u from Category u where u.categoryName like %:input%")
     List findAllByInput(@Param("input") String input);

答案 7 :(得分:1)

尝试一下。

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

答案 8 :(得分:1)

我使用这个:

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

lower()类似于String中的toLowerCase,因此结果不区分大小写。

答案 9 :(得分:0)

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

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

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

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

答案 10 :(得分:0)

您可以在参数后简单地说“Like”关键字..

List<Employee> findAllByNameLike(String name);