Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa 有效地查询和组合来自多个表的排序分页结果_Jpa_Spring Data Jpa_Spring Data - Fatal编程技术网

Jpa 有效地查询和组合来自多个表的排序分页结果

Jpa 有效地查询和组合来自多个表的排序分页结果,jpa,spring-data-jpa,spring-data,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_

我有一个成员层次结构——组织和用户。组织可能包含其他组织或用户。一个组织或用户只是一个组织的成员(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)。我可以实现它的最简单的方法是查询表Organization(使用成员上的联接),然后查询表user(使用成员上的联接),然后合并结果集。但是多个顺序查询似乎没有多大效果。有更好的办法吗?例如,用并行查询替换两个查询?或者在单个查询中获取结果集?请告知。先谢谢你

您可以在
JPA
继承中使用
join策略。为
成员
表创建一个类
成员
,为
用户
表和
组织
创建两个类
用户
,扩展
成员

@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数据存储库

public interface MemberRepository extends JpaRepository<Member, String> {
    List<Member> findByParentMember(Member parent);
    Page<Member> findByParentMember(Member parent, Pagable pageable);
}
public interface MemberRepository扩展了JpaRepository{
列出findByParentMember(成员父级);
PageFindByParentMember(成员父级,可分页);
}
通过这种方式,hibernate将在所有3个表之间创建一个连接查询,而不是在两个表之间创建两个连接查询,从而返回所有成员(用户和组织)