使用“喜欢”运算符的自定义jpa查询中的类型不匹配错误

问题描述

我正在尝试编写这样的选择(可从控制台使用)

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);