Spring Data JPA: использование свойства в @Query в качестве параметра - PullRequest
2 голосов
/ 29 октября 2019

У меня есть несколько application-x.properties файлов, которые используются для разных профилей, и каждый файл содержит свойство с определенным значением для каждого профиля. Я хочу использовать это свойство в запросах к базе данных в качестве параметра.

Возможно ли добавить его, используя SpEL или что-то еще?

Например, application.properties:

query.parameters.role: ADMIN

возможное использование:

@Query(value = "select u from User u where u.role = :#{query.parameters.role}")
Set<User> getAllUsers();

1 Ответ

5 голосов
/ 29 октября 2019

Вы можете сделать это следующим образом:

1.- Найти всех пользователей по ролям, используя Ключевые слова запроса репозитория

@Repository
public interface UserRepository extends JpaRepository<User, UUID> {

    Set<User> findByRole(String role);
}

2.- Создать методвызывается getAllUsers в UserService и получает role value с помощью @ Value :

@Service
public class UserService {

    @Autowired
    private UserRepository repository;

    @Value("${query.parameters.role}")
    private String role;

    public Set<User> getAllUsers() {
        return repository.findByRole(role);
    }
}  

Другой способ ответить на этот вопрос - реализовать пользовательскийSpEL, поддерживаемый @Query, вы можете посмотреть эту поддержку SpEL в Spring Data JPA

Тогда вы должны выполнить следующие шаги для вашего случая:

1.- Создайте класс ConfigProperties, чтобы вы могли читать и получать application.properties.

@Configuration
@PropertySource("classpath:application.properties")
@ConfigurationProperties(prefix = "query")
public class ConfigProperties {

    private Parameters parameters;

    // standard getters and setters
}

public class Parameters {

    private String role;

    // standard getters and setters
}

2.- Реализовать пользовательский EvaluationContextExtensionSupport и ссылку на ConfigProperties

public class PropertyEvaluationContextExtension extends EvaluationContextExtensionSupport {

    private final ConfigProperties configProperties;

    public PropertyEvaluationContextExtension(final ConfigProperties configProperties) {
        this.configProperties= configProperties;
    }
    @Override
    public String getExtensionId() {
        return "properties";
    }

    @Override
    public ConfigProperties getRootObject() {
        return this.configProperties;
    }
}

3.- Создайте bean-компонент, который будет называться вашим кастомным PropertyEvaluationContextExtension

@Configuration
public class CustomConfig {

    private final ConfigProperties configProperties;

    public CustomConfig(final ConfigProperties configProperties) {
        this.configProperties= configProperties;
    }

    @Bean
    EvaluationContextExtensionSupport propertyExtension() {
        return new PropertyEvaluationContextExtension(configProperties);
    }
} 

4.- Назовите query.parameters.role в следующем формате: ?#{query.parameters.role}

@Query(value = "SELECT u FROM User u WHERE u.role = ?#{query.parameters.role}")
Set<User> getAllUsers();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...