嘿,我正在尋找方式來搜索文本模式(以jpa)和排序結果,首先所有結果開始與此字符串,然後所有其他結果。 我發現Mysql order by using search string獲得MySQL的order by - 使用搜索字符串 - JPA
答案大部分的答案使用union
(其中不存在jpa
)和力來查詢數據庫或打開一個視圖。 (從代碼排序不,良好的解決方案,因爲我們使用分頁得到的結果作爲結果的大小可真夠大的一部分)
一個解決方案,我從上面的鏈接喜歡的是: select * from employee where name like '%ani%' order by locate('ani', name) asc, name asc
source
這在我看來很清楚,但我不知道如何將其轉換爲jpa。好像Order對象是不是能夠得到定位輸出
任何想法將受到歡迎
謝謝!
阿龍
編輯: 感謝答覆。我試圖達到與jpa critiera相同
Iterator<Order> sortingIter = page.getSort().iterator();
ArrayList<javax.persistence.criteria.Order> order = new ArrayList<javax.persistence.criteria.Order>();
String fieldName;
while (sortingIter.hasNext()) {
Order sort = sortingIter.next();
fieldName = sort.getProperty();
order.add(sort.getDirection() == Sort.Direction.ASC ? cb
.asc(keyword.get(fieldName)) : cb.desc(keyword
.get(fieldName)));
}
雖然以上工作良好。我不能將以下行添加到代碼中。好像Order
對象犯規和他們一樣
Expression<String> fieldValue = keyword.get(fieldName);
order.add(cb.locate(fieldValue,key));
編輯2: 試圖 order.add(新javax.persistence.criteria.Order(){
@Override
public javax.persistence.criteria.Order reverse() {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean isAscending() {
// TODO Auto-generated method stub
return true;
}
@Override
public Expression<?> getExpression() {
// TODO Auto-generated method stub
return cb.locate(fieldValue,key);
}
});
JPA不會抱怨,但查詢沒有得到正確的訂單
編輯3: 發現我的錯誤!
我上面傳遞的關鍵值已經包含「%」和雙方...所以找到沒有正常工作。
現在我在某些特殊字符上出現了一些奇怪的行爲:if - 例如 - 我有字Ghurabā
查詢like %ba%
會找到它。但是,看起來locate(Ghurabā,ba)
會返回0 - 意思是pattern was not found in string
任何想法如何克服這個問題?
似乎這不僅是jpa而且還有mysql行爲。
SELECT *
FROM `keywords`
WHERE name LIKE '%ba%'
ORDER BY LOCATE( 'ba', name) , name
LIMIT 0 , 30
將返回一個結果
Ghurabā'
Khuṭabā'
qabā\
Ribāṭ
ba'urchi (cook)
Baghdad
...
注意其工作「正規英文字符」但等與定位功能
之間的不匹配使用Collcation
:utf8_general_ci
(與utf_unicode_ci
得到相同的結果)
嘿@Koitoer感謝您的快速回復。我編輯我的問題使用JPA ceriteria – oak