2017-05-26 73 views
1

我面臨着通過某些(子)字符串搜索實體的簡單問題,它們可能包含這些字符串。例如。我有u_name用戶的「衣服」,「mechrags」,「meragsch」我將進入到搜索窗口中的「衣服」,我 使用下面的查詢搜索含有「破布」JPQL對搜索結果進行排序,使用ObjectDB

SELECT u FROM User_personal u WHERE u_name LIKE'%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」的「衣服」,」 meragsch 「 」mechrags「 答案

應該是 」衣服「, 」ragsch「, 」meragsch「, 」mechrags「,但輸出中是

」ragsch「, 」衣服「, 」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#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 

For checkin g我直接給了「破布」,並得到了必要的輸出,但在通過論證時不能理解問題。

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

給出正確的輸出。

誰能SUGGEST正確方法在這裏用變

得到它!!!!!!

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「或」抹布「應返回相同的值

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

如果我給「衣服」發現「衣服」和「衣服」和「衣服」和多數民衆贊成什麼,我需要:)

任何更好的方法是值得慶幸的接受拉昇更好的方法 THANK YOU ALL

+0

什麼是JPA提供者調用SQL?這將告訴你,如果您的查詢是正確的 –

+0

Neil我正在使用JPQL ODB – rags18333333

+0

我認爲這裏的錯誤在於「LOCATE('rags',u.u_name)」。它應該是LOCATE(u.u_name,'rags')正確的? – rags18333333

回答

0

也許只是2個表達式?

選擇[u] FROM User_personalüWHERE u_name LIKE '%破布%' ORDER BY LOCATE(u.u_name, '抹布'),長度(u.u_name)

+0

awesome !!!正確地工作非常感謝你 – rags18333333

相關問題