Я могу получить значение свойства в классах 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?
Но в обоих случаях, я бы сказал, ваш репозиторий не должен знать имя базы данных. Вам лучше пересмотреть свой дизайн, но если вы не можете его изменить - я предполагаю, что вам придется жестко закодировать имена БД в @Query.
две разные схемы на данный момент. Я настроил, используя: medium.com/@joeclever/…
Рассматривали ли вы создание службы, вставьте туда entityManager и создайте свой запрос с помощью entityManager или API критериев, вы можете создавать более гибкие запросы, используя их. И вы можете вводить значения из .properties в эту службу и использовать их при построении запросов с EntityManager.
Вместо использования репозиториев для этого конкретного случая вы можете создать запрос с помощью EntityManager (вставив его в какой-либо компонент, где вы также можете ввести properties)
Я пробовал использовать EntityManager и Native Query, но мне нужно создать ResultSetMapping, чтобы получить объект «table1». В противном случае ResultSet не сможет сопоставить этот объект.




Я не знаю, возможно ли это, но если нет, вы можете рассмотреть такой подход:
Вместо того, чтобы напрямую использовать свойства в @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);
}
}
Это всего лишь пример. Но я считаю, что это может быть полезно.
Удачного взлома :)
Спасибо за ваш ответ. да, мы можем отправить значение в метод репозитория и использовать его в @Query. Это будет работать только для одного места. Если я хочу использовать имя базы данных для разных таблиц соединения в одном собственном запросе. Не думаю, что это правильный подход.
Может быть, вы могли бы добавить более подробную информацию о вашем деле? Насколько я понял, вы пытаетесь сделать - я бы сказал, что ваш дизайн не очень хорош. Добавление имени базы данных в запрос звучит для меня неправильно.
В этом нет ничего плохого, на самом деле это имеет смысл, когда вы выполняете соединения с перекрестными схемами. У меня такая же проблема, хотя мне удалось передать значение, потому что оно имеет "." после него он не находит поле param, поскольку обрабатывает его так, как если бы я пытался получить доступ к полю внутри моего Param, как в paramName.fieldIntheParam, когда я пытался использовать строку в качестве имени таблицы в столбце в таблице. также мне пришлось сделать имя схемы настраиваемым, другой уровень, но та же проблема. Это очень сложная проблема.
Хороший вопрос: что вы подразумеваете под двумя базами данных различий? Потому что, если вы говорите о двух совершенно разных серверах БД, вам, вероятно, нужно настроить 2 источника данных, или вы можете говорить о 2 разных схемах, и это другой случай.