Hibernate, объединяющий две колонки против одной - PullRequest
1 голос
/ 24 февраля 2020

У меня есть такие таблицы: Таблица1: Пользователи

+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| id         | int         | NO   | PRI | NULL    | auto_increment |
| name       | varchar(45) | NO   |     | NULL    |                |
| lastname   | varchar(45) | NO   |     | NULL    |                |
| birth_date | date        | NO   |     | NULL    |                |
| is_deleted | tinyint     | NO   |     | 0       |                |
+------------+-------------+------+-----+---------+----------------+

Объект 1:

@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", unique = true, updatable = false, nullable = false)
    private int id;
    @Column(name = "name", nullable = false)
    private String name;
    @Column(name = "lastname", nullable = false)
    private String lastName;
    @Column(name = "birth_date")
    private Date birthDate;
    @Column(name = "is_deleted")
    private boolean isDeleted;

Таблица 2: Дружба

+----------------+-----------+------+-----+-------------------+-------------------+
| Field          | Type      | Null | Key | Default           | Extra             |
+----------------+-----------+------+-----+-------------------+-------------------+
| first_user_id  | int       | NO   |     | NULL              |                   |
| second_user_id | int       | NO   |     | NULL              |                   |
| timestamp      | timestamp | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
+----------------+-----------+------+-----+-------------------+-------------------+

Объект 2:

@Entity
@Table(name = "friendships")
public class Friendship {
    @Id
    @Column(name = "first_user_id")
    private int firstUserId;
    @Id
    @Column(name = "second_user_id")
    private int secondUserId;

Я должен получить всех друзей пользователя, используя Hibernate без собственных SQL запросов. Идентификатор пользователя может появиться в обоих столбцах 2-й таблицы. С JDB C и SQL я использовал этот запрос:

SELECT u.id, u.name, u.lastname FROM users u
 INNER JOIN friendships f
  ON u.id = f.first_user_id OR u.id = f.second_user_id
  WHERE f.second_user_id = :userId AND u.id = f.first_user_id
UNION
SELECT u.id, u.name, u.lastname  FROM users u
 INNER JOIN friendships f
  ON u.id = f.first_user_id OR u.id = f.second_user_id
  WHERE f.first_user_id = :userId AND u.id = f.second_user_id;

Возможно ли это сделать с помощью Hibernate?

Ответы [ 2 ]

0 голосов
/ 24 февраля 2020

Если вы можете изменить сущность Friendship на это:

@Entity
@Table(name = "friendships")
public class Friendship {
    @Id
    private int id;

    @JoinColumn(name = "first_user")
    @ManyToOne(fetch = FetchType.LAZY)
    private Userss firstUser;

    @JoinColumn(name = "second_user")
    @ManyToOne(fetch = FetchType.LAZY)
    private Userss secondUser;
}

Тогда вы можете просто использовать Hibernate Query Language (HQL) для извлечения данных из таблицы дружбы: Query query = session.createQuery("from Employee");

0 голосов
/ 24 февраля 2020

Прежде всего, я думаю, ваш запрос может быть упрощен до

SELECT u.id, u.name, u.lastname FROM users u
INNER JOIN friendships f
ON u.id = f.first_user_id OR u.id = f.second_user_id
WHERE (f.second_user_id = :userId AND u.id = f.first_user_id)
OR (f.first_user_id = :userId AND u.id = f.second_user_id)

, и если я не ошибаюсь, запрос Hibernate должен выглядеть как

SELECT u.id, u.name, u.lastName FROM User u 
INNER JOIN Friendship f 
ON u.id = f.firstUserId OR u.id = f.secondUserId 
WHERE (f.secondUserId = :userId AND u.id = f.firstUserId) 
OR (f.firstUserId = :userId AND u.id = f.secondUserId)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...