Java JPQL:将Long转换为字符串以执行类似的搜索

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

我有以下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
上执行类似搜索?

您可以使用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类型创建一个新列?