Сложный строковый запрос JPQL - PullRequest
3 голосов
/ 07 сентября 2010

Я пытаюсь выполнить довольно сложный запрос к строковому полю в базе данных.Я не очень опытен в JPQL, поэтому я подумал, что постараюсь получить помощь.

У меня есть поле в базе данных, которое называется FILE_PATH.В поле FILE_PATH будут значения, такие как:

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

Мне нужно иметь возможность выполнять поиск по заданному пользователем запросу только по имени файла.Таким образом, вместо простого выполнения SELECT Table FROM Table AS t WHERE t.filePath LIKE '%:query%', все будет немного сложнее, чтобы приспособиться только к части пути в имени файла.Путь к файлу и имя файла являются динамическими данными, поэтому я не могу просто жестко закодировать строку префикса там.Это меня сильно смущает, но я знаю, что в JPQL есть некоторые строковые выражения, которые могут справиться с этим требованием.

По сути, мне просто нужно вернуть все строки, которые соответствуют данному запросу, в любом случае после последнего '\' в поле FILE_PATH.Возможно ли это?

Спасибо за помощь.

РЕДАКТИРОВАТЬ: База данных, которая используется является SQL Server.

Ответы [ 2 ]

1 голос
/ 10 сентября 2010

Final WHERE Пункт:

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

ПРИМЕЧАНИЕ. Для повышения производительности вы можете сохранить местоположение косой черты.

Благодаря Thomas Mueller запомощь.

1 голос
/ 09 сентября 2010

Вероятно, лучшее решение - это добавить отдельный столбец, содержащий только имя файла. Если вы не можете, то это может сработать (в зависимости от базы данных, которую вы используете):

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 сделает это за вас).

...