JPQL упорядочение результатов поиска с использованием ObjectDB
Я сталкиваюсь с простой проблемой поиска сущностей по какой-то (под) строке, которую они могут содержать. Например, у меня есть пользователи с u_name как "rags","mechrags","meragsch", и я войду в окно поиска "rags", и я использовал следующий запрос для поиска строк, содержащих "rags"
SELECT u FROM User_personal u WHERE u_name LIKE'%rags%'
Я хочу упорядочить результаты, возвращенные вышеупомянутым запросом на основе первого вхождения строки поиска "rags" в строке, чтобы результатом были rags, meragsch, mechrags (в этом порядке).
Я думаю об использовании функции LOCATE для приведенного выше результата следующим образом
SELECT u FROM User_personal u WHERE u_name LIKE'%rags%' order by
LOCATE(u.u_name,'rags')
но результат лучше, чем предыдущий, но если есть 4 пользователя "ragsch","rags","meragsch","mechrags" ответ
должно быть "rags", "ragsch","meragsch","mechrags", но вывод
"ragsch","rags","meragsch","mechrags", т.е. порядок базы данных
Я имею в виду использовать подзапросы, где мы заказываем сначала по длине, а затем результаты, если заказаны при первом появлении "ветошь", результат может прийти, но запрос не выполняется
select user from User_personal user where exists (select u from User_personal u where u.u_name like'%rags%' order by LENGTH(u.u_name)) order by LOCATE(user.u_name,'rags')
КАК ЗДЕСЬ http://docs.oracle.com/html/E13946_04/ejb3_langref.html
Кто-нибудь может предложить метод для получения правильного вывода?
SELECT u FROM User_personal u WHERE u_name LIKE'%rags%' ORDER BY LOCATE(u.u_name,'rags'), LENGTH(u.u_name)
дает правильный вывод, предложенный BY OBJECT_DB
Теперь у меня есть проблема с использованием его в методе, как показано ниже
public static List<User_personal> search(String str, EntityManager em)
{
String dup ="%"+str+"%";
Query q = ("SELECT u FROM User_personal u WHERE u_name LIKE :dup ORDER
BY LOCATE(u.u_name,'rags'), LENGTH(u.u_name)",User_personal.class)
List<User_personal> result = q.getResultList();
if (!result.isEmpty()) {
return result;
}
return null;}*
если я дам str как "rags", я должен получить все "u" с необходимыми условиями, но он показывает ошибку, как показано ниже
<h1>HTTP Status 500 - Attempt to execute a query with too few arguments
Для проверки я дал "ветошь" напрямую и получил требуемый вывод, но не могу понять проблему при передаче аргумента.
public static List<User_personal> search(String str,EntityManager em)
{
//String dup ="%"+str+"%";
Query q = ("SELECT u FROM User_personal u WHERE u_name LIKE '%rags%'
ORDER BY LOCATE(u.u_name,'rags'), LENGTH(u.u_name)",User_personal.class)
List<User_personal> result = q.getResultList();
if (!result.isEmpty()) {
return result;
}
return null;}*
дает правильный вывод.
МОЖЕТ ЛИ ЧТО ПРЕДЛАГАЕТ ПРАВИЛЬНЫЙ СПОСОБ ИСПОЛЬЗОВАНИЯ ПЕРЕМЕННОЙ ЗДЕСЬ
понял!!!!!!
public static List<User_personal> search(String str, EntityManager em) {
Query q = em.createQuery("SELECT u FROM User_personal u WHERE
CONCAT(u.fname,u.lname) LIKE :name ORDER BY
LOCATE(CONCAT(u.fname,u.lname),'rags'),
LENGTH(CONCAT(u.fname,u.lname))",
User_personal.class);
q.setParameter("name", "%"+str+"%");
List<User_personal> result = q.getResultList();
if (!result.isEmpty()) {
return result;
}
return null;}
Это дает все "и" с "тряпками", а также в порядке длины и первого присутствия "тряпок" тоже
так можем ли мы сделать это, как не чувствительно к регистру, как "Rags" или "RAGS" ИЛИ "rags" должны возвращать одинаковые значения??
СДЕЛАННЫЙ!!!
public static List<User_personal> search(String str, EntityManager em) {
Query q = em.createQuery("SELECT u FROM User_personal u WHERE
lower(CONCAT(u.fname,u.lname)) LIKE lower(:name) ORDER BY
LOCATE(CONCAT(u.fname,u.lname),'rags'),
LENGTH(CONCAT(u.fname,u.lname))",
User_personal.class);
//SELECT u FROM User u WHERE lower(u.username) LIKE :username
q.setParameter("name", "%"+str+"%");
List<User_personal> result = q.getResultList();
if (!result.isEmpty()) {
return result;
}
return null;}
Если я даю "Тряпки", он находит "Тряпки", "Тряпки" и "Тряпки", и это то, что мне нужно:)
К счастью, любой лучший метод, попробуйте лучшие методы, СПАСИБО ВСЕМ
1 ответ
Может быть, только 2 порядка выражений?
ВЫБЕРИТЕ ОТ ОТ ЛИЧНОГО ПОЛЬЗОВАТЕЛЯ u ГДЕ u_name НРАВИТСЯ '%rags%' ЗАКАЗАТЬ ПО МЕСТУ (u.u_name,'rags'), ДЛИНА (u.u_name)