在where子句中使用like的命名查询

34

在命名查询中,在where子句中使用like操作符是否可行?我正在尝试以下操作,但是会收到异常。

@NamedQuery(name = "Place.getPlaceForCityAndCountryName",
query = "SELECT p FROM Place p WHERE " +
        "lower(p.city) like :city and " +
        "lower(p.countryName) like :countryName");

我尝试像在普通SQL中添加%一样,但编译时出现异常。

非常感谢任何指导!

谢谢


1
如果你从lower()函数中删除第二个括号会发生什么? :) - Davos555
正如@Davos555所指出的那样,缺少一个括号和一个引号:"lower(p.countryName) like :countryName"); - ypercubeᵀᴹ
是的,谢谢 - 我从一个更复杂的例子中复制了这个代码,但没有正确修改。我现在会更新问题。 - RNJ
5个回答

66

NamedQuery中不能使用“%”符号,但是你可以在为参数分配值时使用它。

例如:

String city = "needle";
query.setParamter("city", "%" + city + "%");

当您有多个城市值时,如何执行此操作。 - Mohit Arora

14
您还可以使用 CONCAT 函数。
@NamedQuery(name = "Place.getPlaceForCityAndCountryName",
     query = "SELECT p FROM Place p WHERE " +
        "lower(p.city) like CONCAT(:city,'%')");

7
@Query("select c from Curso c where c.descripcion like CONCAT(:descripcion,'%')")

List<Curso> findByDescripcionIgnoreCase(@Param("descripcion") String descripcion);

1
欢迎来到 Stack Overflow!虽然这段代码可能回答了问题,但提供关于为什么和/或如何回答问题的额外上下文可以提高其长期价值。我们不鼓励只有代码的答案。 - Ajean

1

仅使用JPA,没有Spring Data Jpa,您必须定义命名查询而不使用%,然后将模式本身与%一起作为值的一部分包含在内,如@esej所述:

  @NamedQuery(
    name = ParametersQueryOnEntityEntity.Queries.BY_LIKE,
    query = "SELECT e FROM SomeEntity e WHERE name LIKE :name")

使用Spring的@Query,您可以在查询中定义包含%的模式值,并仅在方法中传递模式值:

  @Query("SELECT e FROM SomeEntity e WHERE name LIKE %:name%")
  List<SomeEntity> byLike(@Param(PARAM_NAME) String name);

0
如果您正在使用位置参数,可以使用这种方式。
@Query("select p from ABC p where p.name like CONCAT('%',?1,'%') ")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接