Используйте специфический собственный запрос для Oracle / PostgreSql в аннотации Spring @Query
У меня есть один метод в spring repository
лайк native
@Repository
public interface MessageRepository extends JpaRepository<Message, String> {
@Query(value = "select sm.* from MESSAGES ...", nativeQuery = true)
List<Message> findReadyToSend();
}
Этот запрос для Oracle, но у меня также есть PostgreSQL, и мне нужно создать собственный запрос для PostgreSQL, и когда я запускаю свой весенний загрузочный сервер с профилем Postgres, мне нужно использовать этот запрос. Когда я начинаю с профиля Oracle, мне нужно использовать запрос для Oracle.
Например, я могу переместить строку запроса в файл конфигурации:
in oracle profile config:
query=select sm.* from MESSAGES ... (oracle)
in Postgre profile config:
query=select sm.* from MESSAGES ... (PostgreSQL)
Но как я могу передать эту строку @Query
аннотаций? Что-то вроде этого:
String query - get from config;
@Query(value = query)
Может быть, есть правильный способ сделать это?
1 ответ
Моя идея состоит в том, чтобы предоставить две старые добрые реализации интерфейса и добавить аннотацию @Profile, чтобы указать, какой компонент должен быть активирован в соответствии с активным профилем пружины.
Таким образом, интерфейс будет:
public interface MessageRepository extends JpaRepository<Message, String> {
List<Message> findReadyToSend();
}
И у вас будет две реализации, одна для Oracle, а другая для Postgres:
@Profile("Oracle")
@Repository
public class MessageRepositoryOracleImpl implements MessageRepository {
@Override
List<Message> findReadyToSend(){
Query oracleQuery = .....
return result;
}
.....
,
@Profile("Postgres")
@Repository
public class MessageRepositoryPostgresImpl implements MessageRepository {
@Override
List<Message> findReadyToSend(){
Query postgresQuery = .....
return result;
}
....
Убедитесь, что реализации подобраны контекстом Spring. Из аннотации @Repository я предполагаю, что вы используете компонентное сканирование. Если нет, то вам нужно определить bean-компоненты в конфигурации Java и использовать там аннотацию @Profile.