JPQL: cast Long to String to perform LIKE search

旧巷老猫 提交于 2020-06-24 22:55:22

问题


I have the following JPQL query:

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 )

The customer wants us to be able to search be the nbr field, which is a java.lang.Long.

Q:

How do you perform a LIKE search on a java.lang.Long using JPQL?


回答1:


You can use the CAST in HQL:

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 )

But you can have serious performance problems doing this, because the database will cannot use the nbr index (if nbr column is indexed).




回答2:


simple.. CAST( field as text/varchar) LIKE It must be a type knows by the database (not string like in HQL)

And looking at your query there is a more efficient way to do it:

With CONCAT you don't have to cast NON String arguments (WHEN there is more than one and AT LEAST one is an String)

This works: LOWER(CONCAT(name, nbr, description)) LIKE

This doesn't: CONCAT(nbr), I guess because it doesn't recognize a JPQL function CONCAT(Long.. )




回答3:


I have fixed the same issue by creating a @transient field in the entity and then used below query for search :

id LIKE CONCAT('%',:txnId)



回答4:


You can simply use CAST(num as string) or CONCAT(num,''). It worked for me



来源:https://stackoverflow.com/questions/31078801/jpql-cast-long-to-string-to-perform-like-search

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!