Java %如spring JpaRepository中的%Query
我想在Java %如spring JpaRepository中的%Query,java,jpa,spring-data-jpa,Java,Jpa,Spring Data Jpa,我想在JpaRepository中编写一个类似的查询,但它没有返回任何内容: 类似于“%place%”-它不起作用 像“地点”一样完美地工作 这是我的密码: @Repository("registerUserRepository") public interface RegisterUserRepository extendsJpaRepository<Registration,Long> { @Query("Select c from Registration c whe
JpaRepository
中编写一个类似的查询,但它没有返回任何内容:
类似于“%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);
}
@Repository(“registerUserRepository”)
公共接口注册表SerRepository extendsJpaRepository{
@查询(“从注册c中选择c,其中c.place类似:place”)
列出findByPlaceContaining(@Param(“place”)字符串位置);
}
在查询中,spring数据JPA查询需要“%”字符以及后面的空格字符,如
@Query(“从注册c中选择c,其中c.place like%:place%”)
比照
您可能希望一起去掉@Query
注释,因为它似乎类似于标准查询(由spring数据代理自动实现);i、 e.使用单行线
List<Registration> findByPlaceContaining(String place);
列出findByPlaceContaining(字符串位置);
这就足够了 实际上根本不需要@Query
注释
您可以使用以下命令
@Repository("registerUserRepository")
public interface RegisterUserRepository extends JpaRepository<Registration,Long>{
List<Registration> findByPlaceIgnoreCaseContaining(String place);
}
@Repository(“registerUserRepository”)
公共接口RegisterUserRepository扩展了JpaRepository{
列出findByPlaceIgnoreCaseContaining(字符串位置);
}
您还可以使用Spring Data JPA supported关键字实现类似的查询
列出findByPlaceContaining(字符串位置);
您可以选择使用占位符作为:
@Query("Select c from Registration c where c.place LIKE %?1%")
List<Registration> findPlaceContainingKeywordAnywhere(String place);
@Query(“从注册c中选择c,其中c.place像%?1%”)
列出findPlaceContainingKeywordAnywhere(字符串位置);
调用函数时,我使用:
findbyplace包含(“%”+位置)代码>
或:
findByPlaceContaining(place+“%”)代码>
或:
findByPlaceContaining(“%”+place+“%”)代码>答案将准确无误
-->` @Query("select u from Category u where u.categoryName like %:input%")
List findAllByInput(@Param("input") String input);
-->`@Query(“从类别u中选择u,其中u.categoryName类似%:input%”)
列出findAllByInput(@Param(“输入”)字符串输入);
对于您的情况,您可以直接使用JPA方法。该代码如下所示:
包含:选择。。。like%:place%
List<Registration> findByPlaceContainingIgnoreCase(String place);
列出findByPlaceContainingIgnoreCase(字符串位置);
在这里,IgnoreCase将帮助您在忽略案例的情况下搜索项目
在JPQL中使用@Query:
@Query("Select registration from Registration registration where
registration.place LIKE %?1%")
List<Registration> findByPlaceContainingIgnoreCase(String place);
@Query(“从注册位置选择注册
注册地点(如%?1%))
列出findByPlaceContainingIgnoreCase(字符串位置);
以下是一些相关的方法:
LikefindByPlaceLike
…x.place在哪里?1
StartingWithfindByPlaceStartingWith
…其中x.place类似于?1(参数绑定了附加的%)
EndingWithfindByPlaceEndingWith
…其中x.place类似于?1(参数与前缀%绑定)
包含findByPlaceContaining
…其中x.place类似于?1(参数绑定包装为%)
更多信息、视图和
希望这对你有帮助:)试试这个
@Query("Select c from Registration c where c.place like '%'||:place||'%'")
在没有@Query
的情况下找到了解决方案(实际上我尝试了哪一个是“接受的”。但是,它不起作用)
必须返回页面
,而不是列表
:
public接口EmployeeRepository
扩展分页和排序存储库{
Page findAllByNameIgnoreCaseStartsWith(字符串名称,可分页);
}
IgnoreCase
零件对于实现这一点至关重要 我用这个:
@Query("Select c from Registration c where lower(c.place) like lower(concat('%', concat(:place, '%')))")
lower()类似于字符串中的toLowerCase,因此结果不区分大小写。您只需在参数后面说'like'关键字即可
List<Employee> findAllByNameLike(String name);
列出findAllByNameLike(字符串名称);
使用findbyplaceignorecasescontaining(字符串位置)忽略查询的大小写可能也很有用;作为旁注-您不能在同一查询中混合并匹配%:param%和%param%。否则,应用程序将无法启动。谢谢。我以前用'
编写如“%:place%”
,但根本没有结果,因为Hibernate会将'
s单独添加到字符串中。@Query(“从注册c中选择c,其中c.place如%:place%”)。在Spring Boot版本2.3.3中不起作用。你能告诉我为什么我可以在使用2.3时让它工作吗。3@SubhaBhowmik哪个版本完全不起作用?你说对于2.3.3,它起作用了,也不起作用了。在Spring Boot 2.4.0中,我也在努力使用%:param%,但我发现在SQL函数中不能有%:param%。在LOWER(“%:param%”)中,:param不会因为引号而被替换。希望这能帮助你。对我来说,这是最好的解决办法。我不知道您可以将IgnoreCase与Containing结合使用,文档中没有。如果我想使用多个列,该如何处理我相信@Query()
是必须的,对吗?使用这种方法,我必须使或实际上不是适合这种情况的解决方案:findbyfield1或field2包含(stringphraseforfield1,stringphraseforfield2)
如果我们在查询中使用something=:place
和另一个类似%:place%
的方法,那么这将非常有用。我使用相同的方法,但是当lower函数中的变量为null时,我会得到以下错误,如何添加null检查?功能降低(bytea)不存在
@Query("Select c from Registration c where lower(c.place) like lower(concat('%', concat(:place, '%')))")
List<Employee> findAllByNameLike(String name);