我今天发现了非常奇怪的错误(?)。所以我只想简单地想要通过两个字段搜索一个给定的输入。期望的代码:
@Query("select c from Customer c where upper(c.name) like %:search% or upper(c.number) like upper(%:search%)")
Page<Customer> findByNameOrNumber(@Param("search") String search, Pageable pageable);
但上面的代码段引发了以下异常:
Caused by: java.lang.IllegalArgumentException: Validation failed for query for method public abstract org.springframework.data.domain.Page com.zilliant.webnext.repository.CustomerRepository.findByNameOrNumber(java.lang.String,org.springframework.data.domain.Pageable)!
at org.springframework.data.jpa.repository.query.SimpleJpaQuery.validateQuery(SimpleJpaQuery.java:92) ~[spring-data-jpa-1.9.4.RELEASE.jar:na]
at org.springframework.data.jpa.repository.query.SimpleJpaQuery.<init>(SimpleJpaQuery.java:62) ~[spring-data-jpa-1.9.4.RELEASE.jar:na]
.......
.......
Caused by: java.lang.NullPointerException: null
at org.hibernate.hql.internal.antlr.HqlBaseParser.identPrimary(HqlBaseParser.java:4285)
如果我将查询更改为
select c from Customer c where upper(c.name) like %:search% or upper(c.number) like upper(%:search%)
或
select c from Customer c where upper(c.name) like upper(%:search%) or upper(c.number) like %:search%
然后查询验证没问题,但行为不正确,上面的部分(%:search%)不起作用。
我为jpql找到了以下解决方案,但弹簧数据并非如此。
namedQuery.setParameter("code", "%" + this.value + "%");
无论如何,我有一个解决方法:
Page<Customer> findByNameContainingIgnoreCaseOrNumberContainingIgnoreCase(String name, String number, Pageable pageable);
但是有另一种解决方案而不是11字的方法吗? 谢谢!