Критерии API в предложении (фильтрация) - PullRequest
0 голосов
/ 11 марта 2019

Эй, у меня небольшая проблема с моим запросом.

Мне нужно найти пользователей с определенными компетенциями (например, лицензиями и прочим).

Допустим, у меня есть пользователи с компетенциями:

  • Алекс: A, B, C
  • Джон: A, B
  • Стив: B, C

Запросы:

  • компетенции работников? = A, B, C - должен только вернуть Алекс
    • В настоящее время Алекс возвращается три раза, Джон и Стив дважды
  • работников?компетенции = A, C - должен возвращать только Алекс
    • В настоящее время возвращает Алекса дважды, Джон и Стив один раз
  • компетенции рабочих = B, C - должен вернуть Алекса и Стива
    • В настоящее время возвращает Алекса дважды, Стив дважды и Джона один раз
  • worker? Компетенции = B - должен вернуть всех пользователей
    • В настоящее время возвращает всех один раз

В настоящее время он находит всех пользователей с компетенцией A или B или C.

Мне нужно, чтобы вернуть пользователей со всеми вставленными компетенциями.es так competence A AND competence B AND competence C.

Это моя спецификация в настоящее время:

public static Specification<WorkDetail> hasCompetences(String searchTerm) {
        return (root, query, criteriaBuilder) -> {
            List<String> list = new ArrayList<>(Arrays.asList(searchTerm.split(",")));
            Join join = root.join("competences");
            return join.get("name").in(list);
        };
    }

1 Ответ

1 голос
/ 11 марта 2019

Так как для Алекса есть 3 результата. Я думаю, что ваша структура таблицы выглядит примерно так

name | competence
-----------------
Alex | A
Alex | B
Alex | C
John | A
John | B

Ваш текущий запрос в SQL может выглядеть как

select name from competences where competence in ('A', 'B', 'C')

Возможно, вы захотите добавить distinct

select distinct name from competences where competence in ('A', 'B', 'C')

который в criteria API выглядит .distinct(true)

UPDATE

IN является условием OR. Если вы хотите name только со всеми компетенциями, вам следует сделать следующее (при условии, что в компетенции не будет нескольких записей для человека)

select name from competences where competence in ('A', 'B', 'C') group by name having count(name) = 3;

3 - длина массива IN

...