2010-09-07 100 views
3

我想对数据库中的字符串字段执行相当复杂的查询。我对JPQL并不是很有经验,所以我想我会尽力得到一些帮助。复杂的JPQL字符串查询

我在数据库中有一个名为FILE_PATH的字段。内FILE_PATH领域,会有值,如:

  • 'C:\ TEMP \文件\ FILENAME.TXT'
  • “文件:\\\ C:\测试\ testfolder \ innerfolder \文件名2。 txt'

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

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

感谢您的帮助。

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

回答

1

最后的WHERE子句:

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

注:出于性能考虑,你可能希望保存斜杠的位置。

感谢托马斯米勒的援助。

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

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

+0

谢谢。我会试试这个。我正在使用SQL Server作为数据库。 – 2010-09-09 15:29:28

+0

..不确定LOCATE(,, - 1)是否可以与MS SQL Server一起使用.. – 2010-09-09 15:44:07

+0

看起来像LOCATE(,, - 1)不会使用MS SQL Server进行右侧搜索:http:// msdn.microsoft.com/en-us/library/ms186323.aspx“如果未指定start_location,则为负数,或为0,则搜索将从expression2开始。” - 所以没有反向搜索。是否可以使用原生查询?在这种情况下,您可以使用REVERSE来“模拟”从右向左搜索。 – 2010-09-09 15:50:24