Таблицы объединения с spring data jpa

#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