Можно ли @Query две микросервисные базы данных на Java? - PullRequest
1 голос
/ 07 мая 2019

Я пытаюсь написать запрос, в котором для получения данных будут применяться условия в двух базах данных приложений микро-услуг.Можно ли написать @Query в репозитории для этого, или мне нужно будет сделать это из службы или любым другим способом?С текущими функциями ниже я получаю ошибку.Любые примеры кода или справочные статьи будут по-настоящему оценены.

Ниже я показал свою функцию контроллера и запрос к хранилищу.

Функция контроллера:

@GetMapping("/orders/query/test/")
public List<Orders> findAllOrdersWhereCondition(){
    log.info("Start of findAllOrdersWhereCondition method");
    return repository.findAllActiveAndUnrespondedQueriesForHelp();
}

Функции репозитория:

@Query("SELECT g FROM ORDERS g INNER JOIN operators o ON g.profileToId = o.id OR g.profileFromId = o.id WHERE g.active = true and g.responded = false AND o.operatorType = 1 ")
List<Orders> findAllActiveAndUnrespondedQueriesForHelp();

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

Это одна служба, которая взаимодействует с двумя базами данных, или две службы, каждая из которых взаимодействует со своими собственными базами данных?

Если это первое, а базы данных являются реляционными и ACID, вы можете выполнить JOIN и выполнить один запрос.

Если это последнее, вам нужно сделать два HTTP-запроса, по одному для каждой службы. Они не знают друг о друге. В этом случае вы, вероятно, отказались от ACID.

0 голосов
/ 07 мая 2019

Трудно дать правильный ответ без сообщения об ошибке и классов сущности вашего приложения.Но я думаю, что вы допустили ошибку в именах таблиц в своем запросе - если вы используете JPQL, вам нужно соблюдать регистр имен классов сущностей, пишущих запрос.В вашем случае это может быть:

@Query("SELECT g FROM Orders g INNER JOIN Operators o ON g.profileToId = o.id OR g.profileFromId = o.id WHERE g.active = true and g.responded = false AND o.operatorType = 1 ")
List<Orders> findAllActiveAndUnrespondedQueriesForHelp(); 

Если вы хотите сделать запрос к базе данных в чистом SQL, вам нужно установить значение true в поле nativeQuery.Например:

@Query("SELECT g FROM Orders g INNER JOIN Operators o ON g.profileToId = o.id OR g.profileFromId = o.id WHERE g.active = true and g.responded = false AND o.operatorType = 1 ", nativeQuery = true)
List<Orders> findAllActiveAndUnrespondedQueriesForHelp(); 
...