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

时间:2012-06-06 10:21:46

标签: java sql jpa named-query

是否可以在命名查询的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中那样添加%,但是会编译异常。

任何指针都非常感谢!

由于

5 个答案:

答案 0 :(得分:47)

您不能拥有NamedQuery中的%,但您可以在分配参数的值中使用%。

如:

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

答案 1 :(得分:8)

您也可以使用CONCAT功能

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

答案 2 :(得分:5)

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

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

答案 3 :(得分: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);

答案 4 :(得分:0)

如果您使用的是位置参数,则可以使用这种方式

@Query("select p from ABC p where p.name like CONCAT('%',?1,'%') ")