Java JPQL:将Long转换为字符串以执行类似的搜索
我有以下JPQL查询:Java JPQL:将Long转换为字符串以执行类似的搜索,java,jpa,jpql,sql-like,long-integer,Java,Jpa,Jpql,Sql Like,Long Integer,我有以下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 :searchTer
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
上执行类似搜索?您可以使用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
列被索引)。简单<代码>强制转换(字段为text/varchar)类似
它必须是数据库知道的类型(而不是HQL中的字符串)
查看您的查询,有一种更有效的方法:
使用CONCAT不必强制转换非字符串参数(当有多个且至少有一个是字符串时)
这项工作:降低(CONCAT(名称,nbr,说明))如
这不是:CONCAT(nbr),我想是因为它不识别JPQL函数CONCAT(Long..)我通过在实体中创建一个@transient字段,然后在下面的查询中用于搜索,解决了相同的问题:
id LIKE CONCAT('%',:txnId)
您只需使用
CAST(num作为字符串)
或CONCAT(num,”)
。它对我来说是有效的, < p>你有没有考虑过JPQL<代码>修剪(Num)< /代码>?< /P>你没有。LIKE仅适用于字符串,根据JPQL BNF,是否没有办法将其转换为字符串或以其他方式调用toString()
?您是否尝试过处理?您可以尝试使用Critieray API和Expression.as(type)
至少用于我的测试数据库(H2)使用Hibernate时,以下操作正常:从MyEntity e中选择e,其中e.id类似“%0%”
-请定义您的JPA提供程序和数据库太糟糕了,问题显然是关于JPQL而不是HQL。。。我们正在使用各种JPA提供商……我错了,@Kawu。本机查询是您的选择吗?您是否考虑使用nbr
作为VARCHAR类型创建一个新列?