Как получить конкретное значение свойства из файла .properties в методе интерфейса Spring Data Repository @Query

Я могу получить значение свойства в классах Spring, как показано ниже:

@Value("${database.name}")
private String databaseName;

Мне нужно выполнить собственный запрос, объединив разные таблицы, находящиеся в разных базах данных.

@Query(value="select t1.* FROM db1.table1 t1 INNER JOIN db2.table2 t2 ON t2.t1_id1 = t1.id1")

Вместо того, чтобы жестко кодировать имена баз данных, например, db1 и db2, я должен получить их из файла свойств.

как получить значение свойства внутри аннотации @Query в репозитории Spring Data JPA?


person Krish    schedule 06.11.2018    source источник
comment
Хороший вопрос: что вы подразумеваете под двумя базами данных diff? Потому что, если вы говорите о двух абсолютно разных серверах БД, вам, вероятно, нужно настроить 2 источника данных, или вы можете говорить о 2 разных схемах, и это другой случай.   -  person ikos23    schedule 06.11.2018
comment
Но в обоих случаях, я бы сказал, ваш репозиторий не должен знать об имени базы данных. Вам лучше пересмотреть свой дизайн, но если вы не можете его изменить - я предполагаю, что вам придется жестко закодировать имена БД в @Query.   -  person ikos23    schedule 06.11.2018
comment
две разные схемы на данный момент. Я настроил с помощью: среды. com/@joeclever/   -  person Krish    schedule 06.11.2018
comment
Рассматривали ли вы возможность создания службы, внедрить туда entityManager и создать свой запрос с помощью entityManager или API критериев, вы можете создавать более гибкие запросы, используя их. И вы можете вводить значения из .properties в эту службу и использовать их при построении запросов с помощью EntityManager.   -  person ikos23    schedule 06.11.2018
comment
Вместо использования репозиториев для этого конкретного случая вы можете вместо этого создать запрос с помощью EntityManager (введя его в какой-либо компонент, где вы также можете ввести properties)   -  person ikos23    schedule 06.11.2018
comment
Я пытался использовать EntityManager и Native Query, но мне нужно создать ResultSetMapping, чтобы получить объект table1. В противном случае ResultSet не сможет сопоставить этот объект.   -  person Krish    schedule 06.11.2018


Ответы (1)


Я не знаю, возможно ли это, но если нет, вы можете рассмотреть этот подход:

Вместо того, чтобы напрямую использовать свойства в @Query репозитория, вы можете использовать параметры в запросе, но при вызове фактического метода вы можете указать значения из .properties.

Представьте, что у вас есть простой репозиторий:

public interface UserRepository extends JpaRepository<User, Long> {

  // query with param
  @Query("select u from User u where u.lastname = :lastname")
  User findByLastname(@Param("lastname") String lastname);

}

Затем, скажем, у вас есть несколько Service или Controller, где вам нужно использовать Repository — вы можете внедрить туда свойства и передать их вашему методу:

@Service
public class UserService {

    // this comes from .properties
    @Value("${user.lastName}")
    private String userLastName;

    @Autowired
    private UserRepository userRepository;

    public User getUser() {
        // you pass it as param to the repo method which
        // injects it into query
        return userRepository.findByLastname(userLastName);
    }
}

Это всего лишь пример. Но я верю, что это может быть полезно.

Удачного взлома :)

person ikos23    schedule 06.11.2018
comment
Спасибо за ваш ответ. да, мы можем отправить значение в метод репозитория и использовать его в @Query. Это будет работать только для одного места. Если я хочу использовать имя базы данных для разных таблиц соединений в одном собственном запросе. Я не думаю, что это правильный подход. - person Krish; 06.11.2018
comment
Может быть, вы могли бы добавить более конкретные сведения о вашем случае? Пока, насколько я понял, вы пытаетесь сделать - я бы сказал, что ваш дизайн не очень хорош. Добавление имени базы данных в запрос звучит как что-то неправильное для меня. - person ikos23; 06.11.2018