эй, я ищу способ поиска текстового шаблона (в jpa) и сортировать результат, сначала весь результат, начинающийся с этой строки, а затем и всех других результатов. я нашел Mysql order by using search string, чтобы получить ответ на MySQLorder-by-use-search-string - JPA
большинство ответов использовать union
(который не существует в jpa
) и силу для запроса БД или открыть представление для этого. (Заказ от кода не, что хорошее решение, так как мы используем пейджинг, чтобы получить часть результата, как размер результата может быть очень большой)
Одно решение я хотел по ссылке выше является: select * from employee where name like '%ani%' order by locate('ani', name) asc, name asc
source
Это кажется мне очень понятным, но я не уверен, как его преобразовать в jpa. Кажется, что объект Order не в состоянии получить местонахождение OUTPUT
любые идеи будут приветствовать
Спасибо!
Alon
EDIT: спасибо за ответ. я получаю то же самое с 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));
EDIT 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 не жалуется, но запрос не в порядке
EDIT 3: Обнаружили ошибку!
Ключевое значение, которое я пропустил выше, уже содержит «%» и обе стороны ... поэтому локация не работает должным образом.
сейчас я получаю какое-то странное поведение по некоторым специальным символам: если - например - у меня есть слово 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
)
hey @Koitoer благодарит за быстрый ответ. Я редактирую свой вопрос для использования JPA ceriteria – oak