ChatGPT解决这个技术问题 Extra ChatGPT

Spring JpaRepository 中的 %Like% 查询

我想在 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);
}

H
Hille

spring data JPA 查询需要“%”字符以及查询中 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);

足够了。


忽略查询的大小写也可能很有用:findByPlaceIgnoreCaseContaining(String place);
就像旁注一样 - 您不能在同一个查询中混合和匹配 %:param% 和 %param% 。否则应用程序甚至不会启动。
谢谢你。我以前用 'like '%:place%' 并没有任何结果,因为 Hibernate 自己将 ' 添加到字符串中。
@Query("Select c from Registration c where c.place like %:place%").在 Spring Boot 版本 2.3.3 中不起作用。你能告诉我为什么我可以在使用 2.3.3 时让它工作吗
@SubhaBhowmik 哪个版本完全不起作用?您说 2.3.3 可以正常工作,但不能正常工作。我也在使用 Spring Boot 2.4.0 与 %:param% 苦苦挣扎,但发现你不能在 SQL 函数中使用 %:param%:Fe in LOWER('%:param%') :param 没有被替换,因为报价标志。希望能帮到你。
A
Alexius DIAKOGIANNIS

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

您可以使用以下内容

    @Repository("registerUserRepository")
    public interface RegisterUserRepository extends JpaRepository<Registration,Long>{
    
    List<Registration> findByPlaceIgnoreCaseContaining(String place);

    }

对我来说,这是最好的解决方案。我不知道您可以将 IgnoreCase 与 Containing 结合使用,它不在文档中。
当我想使用很多列时怎么办? - 我相信 @Query() 是必须的,对吧?使用这种方法,我将不得不使 or 实际上不是一个非常适合这种情况的解决方案:findByField1OrField2Containg(String phraseForField1, String phraseForField2)
M
Md. Sajedul Karim

对于您的情况,您可以直接使用 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);

下面是一些相关的方法:

像 findByPlaceLike ... where x.place like ?1 StartingWith findByPlaceStartingWith ... where x.place like ?1 (参数与附加 % 绑定) EndingWith findByPlaceEndingWith ... where x.place like ?1 (parameter bound with prepended %) 包含 findByPlaceContaining ... 其中 x。像 ?1 的地方(以 % 包裹的参数绑定)

更多信息,查看 this linkthis linkthis

希望对你有帮助 :)


你怎么能反对一种观点呢?
a
amanzoor

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

List<Registration> findByPlaceContaining(String place);

A
Ashu

尝试这个。

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

如果我们在查询中使用 something=:placeanother like %:place% 会很有帮助。
N
Nitin Pawar

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

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

A
Ayo K

调用函数时,我使用:findByPlaceContaining("%" + place);

或:findByPlaceContaining(place + "%");

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


M
Mateusz Niedbal

我用这个:

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

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


我使用相同的方法,但是当下部函数中的变量为空时,我收到以下错误,如何添加空检查?函数 lower(bytea) 不存在
S
Sulaymon Hursanov

答案将是

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

A
Aasim ali

我们可以使用原生查询

@Query(nativeQuery = true, value ="Select * from Registration as c where c.place like %:place%")

List<Registration> findByPlaceContaining(@Param("place")String place);

c
catch23

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

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

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

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


N
Namesh Silva

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

List<Employee> findAllByNameLike(String name);

u
user1355816

我们这样

@Query("来自 CasFhgDeviceView where deviceGroupName like concat(concat('%CSGW%', :usid), '%') ")


此答案是否提供比其他答案更多的信息?如果是这样,请edit它并添加有关您的答案有助于解决问题的信息。如果不是,请删除您的答案。谢谢。
S
Satish Patro

可以有各种方法。正如许多人的回答中提到的,如果可能的话,您可以使用 JPA 预定义的模板查询。

List<Registration> findByPlaceContainingIgnoreCase(String place);

此外,您可以在调用上述方法之前在 java 层中附加 '%'。

如果查询复杂,那么你通常可以使用@Query 之一

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

为了可读性,您可以使用以下一种

@Query("Select r from Registration r where r.place like CONCAT('%', :place, '%'")

P
Procrastinator

我不得不使用这样的东西CONCAT('%',:setName,'%')