IllegalArgumentException:该位置[1]的参数不存在 - LOWER&包含使用情况

时间:2017-03-08 16:59:07

标签: spring jpa spring-data hql spring-data-jpa

我是Spring Data JPA的新手。我有这个查询。 LOWER功能和CONTAINING(case-insensitive)是强制性的。

如果我使用它,它的工作正常:

findByCityContainsAndAreaContainsAndType(String city,String area, String type);

使用@Query的原因是我想使用连接。但是('%?1%')似乎有问题。 不知道如何实现它。

@Query(value=" select * from Agreement where LOWER(city) like LOWER('%?1%') and LOWER(AREA) like LOWER('%?2%') and type=?3", nativeQuery = true)
public List<Agreement> getAgreementDetailsByCityAreaAndType(String city,String area, String type);

获取错误:

Caused by: java.lang.IllegalArgumentException: Parameter with that position [1] did not exist

还试过JPA:

@Query(value=" select sa from Agreement sa where LOWER(sa.city) like LOWER('%?1%') and LOWER(sa.area) like LOWER('%?2%') and sa.type=?3")
    public List<Agreement> getAgreementDetailsByCityAreaAndType(String city,String area, String type);

同样的问题:

Caused by: java.lang.IllegalArgumentException: Parameter with that position [1] did not exist

也尝试使用:

LOWER(city) like '%' + LOWER(?1) + '%'

来自: https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#query-by-example.execution

但是它在运行时抛出了查询语法错误。

有什么建议吗?

由于

1 个答案:

答案 0 :(得分:1)

好的,如果您使用的是JPQL而不是本机,那么我建议使用concat函数:

@Query(value=" select sa from Agreement sa 
        where LOWER(sa.city) like LOWER(CONCAT('%', ?1, '%'))
          and LOWER(sa.area) like LOWER(CONCAT('%', ?2, '%')) and sa.type=?3")
    public List<Agreement> getAgreementDetailsByCityAreaAndType(String city,String area, String type);

我记得编号参数存在一些问题,必须使用命名参数。它是在旧版本上,所以试试如上所述。