我有一个成员层次结构-组织和用户。一个组织可以包含其他组织或用户。一个组织或用户只是一个组织的成员(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 进行查询(在成员上使用联接),然后然后合并结果集。但是,多个顺序查询似乎不太有效。有没有更好的办法?例如用并行查询替换两个查询?还是在单个查询中获得结果集?请指教。先感谢您。
答案 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个表之间创建单个联接查询,而不是在两个表之间创建两个联接查询来返回所有成员(用户和组织)。