复杂的JPQL字符串查询

时间:2010-09-07 19:10:47

标签: sql sql-server hql jpql

我正在尝试对数据库中的字符串字段执行非常复杂的查询。我对JPQL不是很有经验,所以我想我会尽力帮忙。

我在数据库中有一个名为FILE_PATH的字段。在FILE_PATH字段中,会有以下值:

  • 'C:\ TEMP \文件\ FILENAME.TXT'
  • '文件:\\\ C:\测试\ testfolder \ innerfolder \ filename2.txt'

我需要能够仅从文件名的用户给定查询中进行搜索。因此,不仅仅是简单地执行SELECT Table FROM Table AS t WHERE t.filePath LIKE '%:query%',事情将不得不变得更加复杂,以适应路径的文件名部分。文件路径和文件名是动态数据,所以我不能只在那里硬编码前缀字符串。这让我非常困惑,但我知道JPQL中有一些字符串表达式可能能够处理这个要求。

基本上,我只需要返回与FILE_PATH字段中最后一个'\'后面的内容匹配给定查询的所有行。这可能吗?

感谢您的帮助。

编辑:正在使用的数据库是SQL Server。

2 个答案:

答案 0 :(得分:1)

最好的解决方案可能是添加一个仅包含文件名的单独列。如果你不能,那么这可能会起作用(取决于你使用的数据库):

drop table test;
create table test(name varchar(255));
insert into test values('C:\temp\name2\filename.txt');
insert into test values('file:\\\C:\\innerfolder\filename2.txt');
select * from test 
where substring(name, locate('\', name, -1)) like '%name2%'

这是纯SQL,但据我所知,JPQL支持所有函数:http://www.datanucleus.org/products/accessplatform/jpa/jpql_functions.html

一个问题是locate(,, - 1)。这意味着'从字符串的结尾开始'。它适用于H2数据库,但不适用于MySQL和Apache Derby。它可能适用于Oracle,SQL Server(我没有测试它)。对于某些数据库可能需要用'\\'替换'\'(MySQL,PostgreSQL;不确定Hibernate是否为你做了这个)。

答案 1 :(得分:1)

最终WHERE条款:

LOWER(SUBSTRING(fs.filePath, LENGTH(fs.filePath) - (LOCATE('\\', REVERSE(fs.filePath)) - 2), (LOCATE('\\', REVERSE(fs.filePath)) - 1))) LIKE '%:query%'

注意:为了提高性能,您可能希望保存斜杠的位置。

感谢 Thomas Mueller 的帮助。