Используйте специфический собственный запрос для Oracle / PostgreSql в аннотации Spring @Query - PullRequest
0 голосов
/ 05 октября 2018

У меня есть один метод в 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 Ответ

0 голосов
/ 05 октября 2018

Моя идея состоит в том, чтобы предоставить две старые добрые реализации интерфейса и добавить аннотацию @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.

...