我是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
但是它在运行时抛出了查询语法错误。
有什么建议吗?
由于
答案 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);
我记得编号参数存在一些问题,必须使用命名参数。它是在旧版本上,所以试试如上所述。