[英]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.