JPQL:将Long转换为String来执行LIKE搜索
我有以下JPQL查询:
SELECT il
FROM InsiderList il
WHERE ( il.deleteFlag IS NULL OR il.deleteFlag = '0' )
AND il.clientId = :clientId
AND ( LOWER( il.name ) LIKE :searchTerm
OR il.nbr LIKE :searchTerm
OR LOWER( il.type ) LIKE :searchTerm
OR LOWER( il.description ) LIKE :searchTerm )
客户希望我们能够搜索nbr
字段,这是一个java.lang.Long
。
Q :
你如何使用JPQL在java.lang.Long
上执行LIKE搜索?
您可以在HQL中使用CAST
:
SELECT il
FROM InsiderList il
WHERE ( il.deleteFlag IS NULL OR il.deleteFlag = '0' )
AND il.clientId = :clientId
AND ( LOWER( il.name ) LIKE :searchTerm
OR CAST( il.nbr as string ) LIKE :searchTerm
OR LOWER( il.type ) LIKE :searchTerm
OR LOWER( il.description ) LIKE :searchTerm )
但是你可能会遇到严重的性能问题,因为数据库不能使用nbr
索引(如果nbr
列索引)。
CAST( field as text/varchar) LIKE
它必须是一个由数据库知道的类型(不像HQL中的字符串 )
并且查看您的查询有一个更有效的方法来执行此操作:
使用CONCAT,您不必输入非字符串参数(当有多个参数时,至少有一个参数是字符串)
这可以工作:LOWER(CONCAT(name, nbr ,description))LIKE
这不:CONCAT(nbr),我猜是因为它不能识别JPQL函数CONCAT(Long ..)
我已经通过在实体中创建@transient字段解决了同样的问题,然后使用下面的查询进行搜索:
id LIKE CONCAT('%',:txnId)
链接地址: http://www.djcxy.com/p/27199.html