Дополнительный фильтр сущности в данных Spring на основе профиля - PullRequest
1 голос
/ 29 января 2020

У меня есть таблица БД, назовем ее USERS. В этой таблице у меня есть стандартные поля, такие как name, surname, age, et c. Эта таблица сопоставлена ​​с классом сущности JPA:

@Entity
@Table(name = "users")
public class User {
    @Id
    @Column(name = "login")
    private String id;

    @Column(name = "name")
    private String name;
    //etc...
}

Теперь мне нужно иметь возможность фильтровать некоторых пользователей в зависимости от среды. Среда может быть определена на основе активного профиля Spring. Мое предположение состояло в том, чтобы добавить новый столбец БД, скажем, boolean filter, и на основе профиля Spring фильтровать или нет пользователя.

Вопрос в том, как лучше реализовать эту функцию, чтобы будет чистым и ремонтопригодным. Один из способов состоит в том, чтобы получить два разных @Repository и в зависимости от профиля инициировать правильный. Один репозиторий вернет всех пользователей, а другой вернет только пользователей с filter=false.

Что мне не нравится в этой реализации, так это то, что будет много дублирования кода. Для каждого метода хранилища у меня должен быть один и тот же метод во втором хранилище, но с фильтрацией по одному столбцу. Есть ли способ определить, может быть, какой-нибудь «перехватчик», который будет делать это автоматически для каждого запроса на чтение для данной сущности БД?

1 Ответ

1 голос
/ 29 января 2020

Не перехватчик, но это можно сделать, используя критерии jpa: Документы

Таким образом, вы можете динамически настраивать то, что вы хотите. Afaik, во время выполнения это будет немного медленнее, чем обычное старое решение с несколькими @Repository, помеченными @ConditionalOnProperty, или другим битом конфигурации по вашему выбору, однако, он отвечает вашему требованию изменения поведения без необходимости введения нескольких репозиториев. Что вы хотели бы сделать, это объявить спецификацию / по умолчанию и передать ее. Таким образом, позже вы также сможете настроить поиск во время выполнения.

...