Как получить конкретное значение свойства из файла .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?

Хороший вопрос: что вы подразумеваете под двумя базами данных различий? Потому что, если вы говорите о двух совершенно разных серверах БД, вам, вероятно, нужно настроить 2 источника данных, или вы можете говорить о 2 разных схемах, и это другой случай.

ikos23 06.11.2018 16:24

Но в обоих случаях, я бы сказал, ваш репозиторий не должен знать имя базы данных. Вам лучше пересмотреть свой дизайн, но если вы не можете его изменить - я предполагаю, что вам придется жестко закодировать имена БД в @Query.

ikos23 06.11.2018 16:28

две разные схемы на данный момент. Я настроил, используя: medium.com/@joeclever/…

Krish 06.11.2018 17:20

Рассматривали ли вы создание службы, вставьте туда entityManager и создайте свой запрос с помощью entityManager или API критериев, вы можете создавать более гибкие запросы, используя их. И вы можете вводить значения из .properties в эту службу и использовать их при построении запросов с EntityManager.

ikos23 06.11.2018 17:21

Вместо использования репозиториев для этого конкретного случая вы можете создать запрос с помощью EntityManager (вставив его в какой-либо компонент, где вы также можете ввести properties)

ikos23 06.11.2018 17:27

Я пробовал использовать EntityManager и Native Query, но мне нужно создать ResultSetMapping, чтобы получить объект «table1». В противном случае ResultSet не сможет сопоставить этот объект.

Krish 06.11.2018 19:48
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
1
6
1 863
1

Ответы 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);
    }
}

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

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

Спасибо за ваш ответ. да, мы можем отправить значение в метод репозитория и использовать его в @Query. Это будет работать только для одного места. Если я хочу использовать имя базы данных для разных таблиц соединения в одном собственном запросе. Не думаю, что это правильный подход.

Krish 06.11.2018 13:12

Может быть, вы могли бы добавить более подробную информацию о вашем деле? Насколько я понял, вы пытаетесь сделать - я бы сказал, что ваш дизайн не очень хорош. Добавление имени базы данных в запрос звучит для меня неправильно.

ikos23 06.11.2018 13:16

В этом нет ничего плохого, на самом деле это имеет смысл, когда вы выполняете соединения с перекрестными схемами. У меня такая же проблема, хотя мне удалось передать значение, потому что оно имеет "." после него он не находит поле param, поскольку обрабатывает его так, как если бы я пытался получить доступ к полю внутри моего Param, как в paramName.fieldIntheParam, когда я пытался использовать строку в качестве имени таблицы в столбце в таблице. также мне пришлось сделать имя схемы настраиваемым, другой уровень, но та же проблема. Это очень сложная проблема.

user259923 20.09.2021 23:09

Другие вопросы по теме