簡體   English   中英

JPQL使用ObjectDB對搜索結果進行排序

[英]JPQL ordering the search results, using 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”的答案

應該是“破布”,“ragsch”,“meragsch”,“mechrags”但是輸出是

“ragsch”,“rags”,“meragsch”,“mechrags”即數據庫順序

我想使用我們首先訂購長度的子查詢,然后結果如果在第一次出現“rags”時排序,結果可能會出現,但查詢沒有運行

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#ejb3_langref_subquerie

誰能建議一種獲得正確輸出的方法?

SELECT u FROM User_personal u WHERE u_name LIKE'%rags%' ORDER BY LOCATE(u.u_name,'rags'), LENGTH(u.u_name) 

給出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作為“破布”我應該得到所有“你”所需的條件,但它顯示如下錯誤

    <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;}

這使得所有“u”具有“破布”,並且還具有長度和第一次出現“破布”的順序

所以我們可以這樣做,像“Rags”或“RAGS”之類的非區分大小寫或“rags”應該返回相同的值嗎?

DONE!

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;}

如果我給“Rags”它找到“破布”和“Rags”和“RAGS”,這就是我需要的:)

謝天謝地接受任何更好的方法嘗試更好的方法謝謝你們

也許只是2個訂單表達式?

SELECT u FROM User_personal u WHERE u_name LIKE'%rags%'ORDER BY LOCATE(u.u_name,'rags'),LENGTH(u.u_name)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM