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)

Другие вопросы по тегам