#java #spring #hibernate #jpa #spring-data-jpa
#java #spring #переход в спящий режим #jpa #spring-data-jpa
Вопрос:
У меня есть 2 таблицы, одна из которых Users
, а другая UserGroup
имеет ManyToMany
отношение, как я могу объединить их в единый список с помощью spring-data-JPA.
** не хотите использовать собственные запросы
Обновить:
точный запрос, который я хочу:
ВЫБЕРИТЕ адрес электронной почты ОТ пользователя
ОБЪЕДИНЕНИЕ
ВЫБЕРИТЕ заголовок Из группы
Комментарии:
1. Я не понял вопроса, вы хотите объединить таблицы в запрос JPA (и у вас уже есть объекты), или вы хотите знать, как отобразить их в объект?
2. @vc73 не я не хочу присоединяться к ним, я хочу результат запроса ‘UNION’ этих таблиц
3. Это 2 совершенно разные вещи. Почему вы хотите это сделать?
4. @AlanHay думайте об этом так, как будто результат будет использоваться как список пользователей или группа пользователей, которые могут быть выбраны для получения электронной почты или чего-то подобного
5. Сделайте это как собственный запрос. Это будет работать
Ответ №1:
Если вы хотите объединение, я предполагаю, что структура этих 2 объектов аналогична.
Вы могли бы создать супер-объект и заставить пользователя и группу пользователей расширить этот новый объект. Добавьте @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
к новому объекту, если вы хотите сохранить 2 отдельные таблицы.
Затем создайте репозиторий Spring Data JPA для родительского объекта.
/**
* new abstract Superclass
*/
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class User {
@Id
private String id;
//...
}
/**
* Existing User entity
*/
@Entity
@Table(name="my_users")
public class LoginUser extends User {
private String password;
@ManyToOne
private Group group;
//...
}
/**
* Existing Group entity
*/
@Entity
@Table(name="my_groups")
public class Group extends User {
private String name;
@OneToMany(mappedBy="group")
private Set<LoginUser> users;
//...
}
/**
* Super repository, providing UNION
*/
public interface UserRepository extends JpaRepository<User, String> {}
Вызов UserRepository.findAll
заставит JPA выполнить UNION
из 2 таблиц и может вернуть List<User>
. В этом списке будут как LoginUser
, так и Group
экземпляры:
// UNION query returning both LoginUser and Group instances
List<User> myUnion = userRepository.findAll();
Смотрите https://en.wikibooks.org/wiki/Java_Persistence/Inheritance для получения более подробной информации о наследовании JPA.
JPA / Hibernate не поддерживает пользовательские запросы ОБЪЕДИНЕНИЯ, но наследование обеспечивает готовое ОБЪЕДИНЕНИЕ между объектами одной иерархии при использовании TABLE_PER_CLASS
стратегии.
Вы не можете сгенерировать нужный запрос с помощью JPA. Невозможно объединить разные поля. Но если вы сопоставите адрес электронной почты и заголовок с одним и тем же полем (что является бессмыслицей) и напишите следующий JPQL, JPA сгенерирует ваш запрос.
SELECT u.yourField FROM User u;
Комментарии:
1. на самом деле таблицам не обязательно иметь commens в union . Я обновил вопрос и добавил запрос, который я хочу.
Ответ №2:
Итак, я решил свою проблему с созданием представления в самой базе данных, а затем сопоставил его с моей сущностью Java, потому что кажется, что hibernate не поддерживает запрос ‘union’
Комментарии:
1. Не могли бы вы подробнее остановиться на этом? Как вы этого добились? Как выглядит представление?
Ответ №3:
Вы можете использовать NativeQuery:
@Query("select u.email from user u union select g.title from group", nativeQuery = true)
public String findResult();
Документация Spring: https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.at-query.native