我正在尝试对数据库中的字符串字段执行非常复杂的查询。我对JPQL不是很有经验,所以我想我会尽力帮忙。
我在数据库中有一个名为FILE_PATH
的字段。在FILE_PATH
字段中,会有以下值:
我需要能够仅从文件名的用户给定查询中进行搜索。因此,不仅仅是简单地执行SELECT Table FROM Table AS t WHERE t.filePath LIKE '%:query%'
,事情将不得不变得更加复杂,以适应路径的文件名部分。文件路径和文件名是动态数据,所以我不能只在那里硬编码前缀字符串。这让我非常困惑,但我知道JPQL中有一些字符串表达式可能能够处理这个要求。
基本上,我只需要返回与FILE_PATH
字段中最后一个'\'后面的内容匹配给定查询的所有行。这可能吗?
感谢您的帮助。
编辑:正在使用的数据库是SQL Server。
答案 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 的帮助。