2010-09-07 94 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