【问题标题】:Named Query with like in where clause在 where 子句中带有 like 的命名查询
【发布时间】:2012-06-10 08:34:00
【问题描述】:

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

任何指针都非常感谢!

谢谢

【问题讨论】:

  • 如果你从 lower() 函数中取出第二个 like 会发生什么:)
  • 正如@Davos555 所指出的,缺少括号和引号:"lower(p.countryName) like :countryName");
  • 是的,谢谢 - 我从一个更复杂的示例中复制了它,但没有正确更改它。我现在会更新问题

标签: java sql jpa named-query


【解决方案1】:

NamedQuery 中不能包含 %,但可以在分配参数的值中包含它。

如:

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

【讨论】:

    【解决方案2】:

    你也可以使用CONCAT函数

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

    【讨论】:

      【解决方案3】:
      @Query("select c from Curso c where c.descripcion like CONCAT(:descripcion,'%')")
      
      List<Curso> findByDescripcionIgnoreCase(@Param("descripcion") String descripcion);
      

      【讨论】:

      • 欢迎来到 Stack Overflow!虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。不鼓励仅使用代码回答。
      【解决方案4】:

      仅使用 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);
      

      【讨论】:

        【解决方案5】:

        如果你使用的是位置参数,你可以这样使用

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-02-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-19
          • 2022-01-06
          • 1970-01-01
          相关资源
          最近更新 更多