Hibernate - Как получить одно значение из другой таблицы без отношения первичного / внешнего ключа? - PullRequest
0 голосов
/ 27 января 2020

У меня есть 2 таблицы (сотрудник и отдел).

сотрудник (идентификатор, имя сотрудника, идентификатор отдела, адрес сотрудника) -> идентификатор первичного ключа

Отдел (идентификатор, название отдела, адрес) -> идентификатор первичного ключа

Примечание: Не учитывать отношения первичный ключ / внешний ключ между этими двумя таблицами

Теперь, основываясь на идентификаторе отдела в Employee, мне нужно получить соответствующее название отдела из отдела и отобразить его в Employee.

Employee (идентификатор, имя сотрудника, идентификатор отдела (Показать имя отдела вместо идентификатора отдела, таблица отдела запросов для получения имени отдела путем передачи идентификатора отдела), адрес сотрудника)

Каковы все возможные способы достижения этого?

С уважением, Радж

Ответы [ 2 ]

1 голос
/ 27 января 2020

Я вижу, по крайней мере, три возможных решения:

  1. Создайте для этого «нормальный» SQL запрос, соединения могут быть идеально выполнены без отношения PK / FK.
  2. Выполните два SQL запроса: один запрос для извлечения сотрудника, затем извлечение идентификатора и второй запрос для извлечения отдела по идентификатору.
  3. Измените сущности JPA, чтобы они включали отношения, как это обычно делается имея отношения @OneToMany, так что вы можете загружать сотрудника в его отдел, как обычно. Как и в случае с 1, для объединений (независимо от того, сделаны ли они вами или провайдером JPA) не требуется отношение PK / FK.

В то время как 1 может быть выполнено с помощью простого SQL, 2 могут быть сделано с помощью менеджера сущностей без необходимости писать "обычный" SQL. 3 было бы самым простым решением, очевидно.

0 голосов
/ 27 января 2020

Вы можете @Query в репозитории и написать свой запрос JPA, используя JOIN.

Пример запроса:

@Query( value = "select new map(employee.name as empName, employee.id as id, department.id as depId, department.name as depName) from Employee employee INNER JOIN Department department ON employee.depId = department.id where employee.id = :id" )
public Map<String,Object> getEmployeeById(long id);
...