Эффективно запрашивать и комбинировать отсортированные постраничные результаты из нескольких таблиц - PullRequest
0 голосов
/ 04 июля 2018

У меня есть иерархия членов - организаций и пользователей . Организация может содержать другие организации или пользователей. Организация или пользователь является членом только одной организации (1: N). Иерархия хранится в таблице member . Таблица организация содержит данные организаций, а пользователь содержит данные пользователей:

CREATE TABLE member(
    member_id CHARACTER VARYING(255) NOT NULL,
    parent_member_id CHARACTER VARYING(255),
    ...
);

CREATE TABLE organization (
    member_id CHARACTER VARYING(255) NOT NULL,
    name CHARACTER VARYING(255) NOT NULL,
    ...
);

CREATE TABLE user (
    member_id CHARACTER VARYING(255) NOT NULL,
    username CHARACTER VARYING(255) NOT NULL,
    first_name CHARACTER VARYING(255) NOT NULL,
    last_name CHARACTER VARYING(255) NOT NULL,
    ...
);

Мне нужно создать конечную точку, которая бы возвращала отсортированный нумерованный список прямых членов определенного члена. Возвращаемый список должен содержать смесь организаций и пользователей. Я использую данные весны (JPARepository). Самый простой способ, которым я мог бы добиться этого, это сделать запрос к таблице организация (используя соединение по элементу), затем выполнить запрос к таблице пользователь (используя соединение по члену), а затем объединить наборы результатов. Но несколько последовательных запросов не кажутся эффективными. Есть ли способ лучше? Например, заменить два запроса параллельными запросами? Или получить набор результатов в одном запросе? Пожалуйста, порекомендуйте. Заранее спасибо.

1 Ответ

0 голосов
/ 08 июля 2018

Вы можете использовать join strategy в JPA наследовании. Создайте класс Member для member таблицы и два класса User для users таблицы и Organization для organizations таблицы, которая расширяет Member class.

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Member {
    @Id
    public String memberId;
    @ManyToOne
    public Member parentMember;

    //getters and setters
}

@Entity
public class User extends Member {
    private String username;
    private String firstName;
    private String lastName;

    //getters and setters
}

@Entity
public class Organization extends Member {
    private String name;

    //getters and setters
}

затем создайте Spring Data Repository для Member класса:

public interface MemberRepository extends JpaRepository<Member, String> {
    List<Member> findByParentMember(Member parent);
    Page<Member> findByParentMember(Member parent, Pagable pageable);
}

Таким образом, hibernate будет возвращать всех участников (пользователей и организации), создавая один запрос на соединение между всеми 3 таблицами вместо двух запросов на соединение между двумя таблицами.

...