3

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

我在数据库中有一个名为FILE_PATH. 在该FILE_PATH字段中,将有以下值:

  • 'C:\temp\files\filename.txt'
  • '文件:\\\C:\testing\testfolder\innerfolder\filename2.txt'

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

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

谢谢您的帮助。

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

4

2 回答 2

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 是否为您这样做)。

于 2010-09-09T05:10:56.483 回答
1

最终 WHERE 条款:

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

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

感谢Thomas Mueller的帮助。

于 2010-09-10T19:26:56.703 回答