Hibernate 复杂的JPA规范编写(涉及继承)

Hibernate 复杂的JPA规范编写(涉及继承),hibernate,jpa,spring-data,jpa-2.0,spring-data-jpa,Hibernate,Jpa,Spring Data,Jpa 2.0,Spring Data Jpa,我对Spring数据相当陌生(直到最近,我主要是通过HQL与Hibernate一起工作),我很难理解以下内容: 我有一个抽象用户实体,子类为用户和管理员。我还有一个产品实体,该实体与项目有1-n关系。我的用户s被分配到特定的项目s的访问权限,因此用户与项目具有1-n。另一方面,管理管理整个产品行,因此管理与产品之间有一个1-n 现在我正在处理一个显示所有用户的表(包括用户s和管理员s)。我需要能够通过一个特定的项目对其进行筛选。这意味着对于给定的项目,我需要显示分配给它的所有用户(简单)和管理给

我对Spring数据相当陌生(直到最近,我主要是通过HQL与Hibernate一起工作),我很难理解以下内容:

我有一个抽象用户实体,子类为用户管理员。我还有一个产品实体,该实体与项目有1-n关系。我的用户s被分配到特定的项目s的访问权限,因此用户项目具有1-n。另一方面,管理管理整个产品行,因此管理产品之间有一个1-n

现在我正在处理一个显示所有用户的表(包括用户s和管理员s)。我需要能够通过一个特定的项目对其进行筛选。这意味着对于给定的项目,我需要显示分配给它的所有用户(简单)和管理给定项目的父产品的所有管理员(不那么简单)。我还需要此表可分页

因此,我知道我的UserRepository需要实现JpaSpecificationExecutor,我需要编写一个规范,以便按照UserRepository.findAll(projectUsersSpecification(projectFilter),pageable)的思路调用某些东西,但我不知道如何编写规范!我在网上找过一些例子,但没有找到任何像我的具体场景这样的例子

任何帮助都将不胜感激

非常感谢,

下面是一些代码:

@MappedSuperclass
public abstract class PersistentEntity implements Serializable {

  @Id
  @GeneratedValue
  private Long id;

  ... getter/setter equals & hashcode ...
}

@Entity
@Inheritance
@DiscriminatorColumn(name="TYPE")
@Table(name="User")
public class AbstractUser extends PersistentEntity {

  public enum Profile {
      USER,
      ADMIN;
  }

  @Column
  @Enumerated(EnumType.STRING)
  private Profile profile;

  ...
}

@Entity
@DiscriminatorValue("USER")
public class User extends AbstractUser {

  @ManyToMany(fetch = FetchType.EAGER)
  private List<Project> projects;

}

@Entity
@DiscriminatorValue("ADMIN")
public class Admin extends AbstractUser {

  @ManyToMany(fetch = FetchType.EAGER)
  private List<Product> products;
}

@Entity
@Table
public class Product extends PersistentEntity {

  @OneToMany(fetch = FetchType.EAGER)
  private List<Project> projects;
}
@MappedSuperclass
公共抽象类PersistentEntity实现可序列化{
@身份证
@生成值
私人长id;
…getter/setter等于&hashcode。。。
}
@实体
@继承权
@鉴别器列(name=“TYPE”)
@表(name=“User”)
公共类AbstractUser扩展PersistentEntity{
公共枚举配置文件{
用户,
管理
}
@纵队
@枚举(EnumType.STRING)
个人资料;
...
}
@实体
@鉴别器值(“用户”)
公共类用户扩展了AbstractUser{
@ManyToMany(fetch=FetchType.EAGER)
私人清单项目;
}
@实体
@鉴别器值(“管理”)
公共类管理员扩展了AbstractUser{
@ManyToMany(fetch=FetchType.EAGER)
私人上市产品;
}
@实体
@桌子
公共类产品扩展了持久性{
@OneToMany(fetch=FetchType.EAGER)
私人清单项目;
}

1-AbstractUser在哪里声明?2-在继承策略中,超类应该是一个实体(映射到数据库),而不是一个抽象类。如果没有可分页的要求,我可以只做两个单独的查询。也许我的域模型有问题……你是否阅读了一些使用规范的教程或示例?我有一些经验,所以我可以帮助你,但我不知道问题出在哪里1-AbstractUser声明在哪里?2-在继承策略中,超类应该是一个实体(映射到数据库),而不是一个抽象类。如果没有可分页的要求,我可以只做两个单独的查询。也许我的域模型有问题……你是否阅读了一些使用规范的教程或示例?我有一些经验,所以我可以帮助你,但我不知道问题出在哪里