有效地查询和合并来自多个表的分页的分页结果

时间:2018-07-03 23:01:53

标签: jpa spring-data-jpa spring-data

我有一个成员层次结构-组织用户。一个组织可以包含其他组织或用户。一个组织或用户只是一个组织的成员(1:N)。层次结构存储在表成员中。表组织包含组织数据,用户包含用户数据:

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,
    ...
);

我需要创建一个端点,该端点将返回某个成员的直接成员的排序后的分页列表。返回的列表应包含组织和用户的混合体。我使用spring数据(JPARepository)。我最容易实现的方法是对表组织进行查询(在成员上使用联接),然后对表 user 进行查询(在成员上使用联接),然后然后合并结果集。但是,多个顺序查询似乎不太有效。有没有更好的办法?例如用并行查询替换两个查询?还是在单个查询中获得结果集?请指教。先感谢您。

1 个答案:

答案 0 :(得分:0)

您可以在join strategy继承中使用JPA。为Member表创建一个类member,为User表创建两个类users,为Organization表创建organizations,扩展了Member课。

@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);
}

通过这种方式,休眠将通过在所有3个表之间创建单个联接查询,而不是在两个表之间创建两个联接查询来返回所有成员(用户和组织)。