问题描述
我正在尝试编写这样的选择(可从控制台使用)
select * from orders o where (o.id like '%1%')
使用
@Query("SELECT o from Order o where o.id like %:searchQuery%")
Page<Order> findAllBySearchQuery(Long searchQuery,Pageable pageable);
但是IDEA显示o.id具有Type mismatch: string type expected
,当我尝试调用该方法时,我得到了java.lang.IllegalArgumentException: Parameter value [%1%] did not match expected type [java.lang.Long (n/a)]
,
我找不到解决方案。我只找到了如何使用nativeQuery = true
来做到这一点,但它不支持Pageable
。
ID类型为bigint。 MariaDB。
解决方法
此处将字符串绑定到已经包含通配符的占位符的正确方法:
@Query("SELECT o from Order o where o.id like :searchQuery")
Page<Order> findAllBySearchQuery(String searchQuery,Pageable pageable);
使用findAllBySearchQuery
时,假设要查找包含数字10的任何searchQuery
,则应绑定到%10%
,类似于id
。例如,调用:
findAllbySearchQuery("%10%",somePageable);
这里还有另一个潜在的问题,即Order#id
的类型以及实际SQL表中的相应类型。理想情况下,它也应该是文本,否则尝试将文本与数字进行比较就没有意义。
编辑:假设您已将id
列显示为整数,则可以先将其转换为文本,然后再进行类似比较:
@Query("SELECT o from Order o where cast(o.id as string) like :searchQuery")
Page<Order> findAllBySearchQuery(String searchQuery,Pageable pageable);