JPA-запрос эквивалентен поиску 10 самых распространенных ключевых слов SQL-запроса - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь написать запрос, который выводит (ограничивает) первые 10 записей с наибольшим количеством совпадений по ключевым словам.Мой SQL-запрос выглядит следующим образом:

SELECT * 
FROM wine 
WHERE
    description LIKE '%dry%'
    OR description LIKE '%depth%'
    OR description LIKE '%strong%'
    OR description LIKE '%spicy%'
ORDER BY
    IF(description LIKE '%dry%',1,0)+
    IF(description LIKE '%depth%',1,0)+
    IF(description LIKE '%strong%',1,0)+ 
    IF(description LIKE '%spicy%',1,0)
DESC LIMIT 10;

Этот запрос работает, находя 10 лучших записей, в которых описания соответствуют ключевым словам (сухой, глубокий, сильный, пряный), а затем упорядочивает их по числу вхожденийэти слова.

Я пытаюсь написать эквивалент запроса JPA, но я относительно новичок в этом.Будет ли использование параметра @Query в WineRepository лучшим вариантом здесь, или эта логика должна быть жестко закодирована с Java в моем файле WineService?

1 Ответ

0 голосов
/ 03 декабря 2018

Pageable - это то, что вы ищете.Если вы хотите объединить аннотацию @Query с настройкой максимальных результатов:

public interface WineRepository extends PagingAndSortingRepository<Wine,Long> {
  @Query("select * from wine where ...")
  List<Wine> findAllWinesWhereKeywordLikes(Pageable pageable);

  default List<Wine> findTop10WinesWhereKeywordLikes() {
    return findAllWinesWhereKeywordLikes(new PageRequest(0,10));
  }

}

Будет ли лучшим вариантом использовать параметр @Query в WineRepository или эта логика должна быть жестко закодирована с помощью Java вмой файл WineService?

На самом деле, лучше создать метод в службе, который получит список ключевых слов, а затем выполнять поиск по этим ключевым словам в хранилище.Потому что, возможно, позже вам нужно будет искать больше ключевых слов, кроме (сухого, глубокого, сильного, острого), и вы сможете использовать свой метод обслуживания везде, где захотите.

...