Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.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 - Fatal编程技术网

带分页的JPA连接

带分页的JPA连接,jpa,spring-data-jpa,Jpa,Spring Data Jpa,我使用的是SpingBoot2.4.5和SpringDataJPA(hibernate实现) 我有一个与下图非常相似的DB 我写了以下几个实体 实体模型类: @Entity @Table(name="ENTITY") public class Entita { @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="ID_ENTITY") privat

我使用的是SpingBoot2.4.5和SpringDataJPA(hibernate实现)

我有一个与下图非常相似的DB

我写了以下几个实体

实体模型类

@Entity
@Table(name="ENTITY")
public class Entita {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="ID_ENTITY")
    private UUID idEntity;
    @Column(name="ENTITY_NAME")
    private String entityName;
    @OneToMany
    private Set<EntityUser> owners;
    //Setter, getter, hashcode and equals
}
@Entity
@Table(name="USER")
public class User {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="ID_USER")
    private UUID idUser;
    @Column(name="NAME")
    private String name;
    @Column(name="LAST_NAME")
    private String lastName;
    @OneToMany
    private Set<EntityUser> entities;
    @OneToMany
    private Set<UserRole> roles;
    //Setter, getter, hashcode and equals
}
@Entity
@Table(name="ENTITY_USER")
public class EntityUser {
    @EmbeddedId
    private EntityUserId pk;
    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("ID_ENTITY")
    @JoinColumn(name="ID_ENTITY")
    private Entita entity;
    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("ID_USER")
    @JoinColumn(name="ID_USER")
    private User user;
    //Setter, getter, hashcode and equals
}
@Embeddable
public class EntityUserId {
    @Column(name = "id_user")
    private UUID idUser;
    @Column(name = "id_entity")
    private UUID idEntity;
    //Setter, getter, hashcode and equals
}
@Entity
@Table(name="USER_ROLE")
public class UserRole {
    @EmbeddedId
    private UserRoleId pk;
    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("ID_USER")
    @JoinColumn(name="ID_USER")
    private User user;
    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("ID_ROLE")
    @JoinColumn(name="ID_ROLE") 
    private Role role;
    //Setter, getter, hashcode and equals
}
@Embeddable
public class UserRoleId {
    @Column(name = "id_user")
    private UUID idUser;
    @Column(name = "id_role")
    private UUID idRole;
    //Setter, getter, hashcode and equals
    
}
EntityUserId PK模型类

@Entity
@Table(name="ENTITY")
public class Entita {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="ID_ENTITY")
    private UUID idEntity;
    @Column(name="ENTITY_NAME")
    private String entityName;
    @OneToMany
    private Set<EntityUser> owners;
    //Setter, getter, hashcode and equals
}
@Entity
@Table(name="USER")
public class User {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="ID_USER")
    private UUID idUser;
    @Column(name="NAME")
    private String name;
    @Column(name="LAST_NAME")
    private String lastName;
    @OneToMany
    private Set<EntityUser> entities;
    @OneToMany
    private Set<UserRole> roles;
    //Setter, getter, hashcode and equals
}
@Entity
@Table(name="ENTITY_USER")
public class EntityUser {
    @EmbeddedId
    private EntityUserId pk;
    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("ID_ENTITY")
    @JoinColumn(name="ID_ENTITY")
    private Entita entity;
    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("ID_USER")
    @JoinColumn(name="ID_USER")
    private User user;
    //Setter, getter, hashcode and equals
}
@Embeddable
public class EntityUserId {
    @Column(name = "id_user")
    private UUID idUser;
    @Column(name = "id_entity")
    private UUID idEntity;
    //Setter, getter, hashcode and equals
}
@Entity
@Table(name="USER_ROLE")
public class UserRole {
    @EmbeddedId
    private UserRoleId pk;
    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("ID_USER")
    @JoinColumn(name="ID_USER")
    private User user;
    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("ID_ROLE")
    @JoinColumn(name="ID_ROLE") 
    private Role role;
    //Setter, getter, hashcode and equals
}
@Embeddable
public class UserRoleId {
    @Column(name = "id_user")
    private UUID idUser;
    @Column(name = "id_role")
    private UUID idRole;
    //Setter, getter, hashcode and equals
    
}
榜样课程

@Entity
@Table(name="ENTITY")
public class Entita {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="ID_ENTITY")
    private UUID idEntity;
    @Column(name="ENTITY_NAME")
    private String entityName;
    @OneToMany
    private Set<EntityUser> owners;
    //Setter, getter, hashcode and equals
}
@Entity
@Table(name="USER")
public class User {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="ID_USER")
    private UUID idUser;
    @Column(name="NAME")
    private String name;
    @Column(name="LAST_NAME")
    private String lastName;
    @OneToMany
    private Set<EntityUser> entities;
    @OneToMany
    private Set<UserRole> roles;
    //Setter, getter, hashcode and equals
}
@Entity
@Table(name="ENTITY_USER")
public class EntityUser {
    @EmbeddedId
    private EntityUserId pk;
    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("ID_ENTITY")
    @JoinColumn(name="ID_ENTITY")
    private Entita entity;
    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("ID_USER")
    @JoinColumn(name="ID_USER")
    private User user;
    //Setter, getter, hashcode and equals
}
@Embeddable
public class EntityUserId {
    @Column(name = "id_user")
    private UUID idUser;
    @Column(name = "id_entity")
    private UUID idEntity;
    //Setter, getter, hashcode and equals
}
@Entity
@Table(name="USER_ROLE")
public class UserRole {
    @EmbeddedId
    private UserRoleId pk;
    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("ID_USER")
    @JoinColumn(name="ID_USER")
    private User user;
    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("ID_ROLE")
    @JoinColumn(name="ID_ROLE") 
    private Role role;
    //Setter, getter, hashcode and equals
}
@Embeddable
public class UserRoleId {
    @Column(name = "id_user")
    private UUID idUser;
    @Column(name = "id_role")
    private UUID idRole;
    //Setter, getter, hashcode and equals
    
}
@实体 @表(name=“USER”)

用户角色ID PK模型类

@Entity
@Table(name="ENTITY")
public class Entita {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="ID_ENTITY")
    private UUID idEntity;
    @Column(name="ENTITY_NAME")
    private String entityName;
    @OneToMany
    private Set<EntityUser> owners;
    //Setter, getter, hashcode and equals
}
@Entity
@Table(name="USER")
public class User {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="ID_USER")
    private UUID idUser;
    @Column(name="NAME")
    private String name;
    @Column(name="LAST_NAME")
    private String lastName;
    @OneToMany
    private Set<EntityUser> entities;
    @OneToMany
    private Set<UserRole> roles;
    //Setter, getter, hashcode and equals
}
@Entity
@Table(name="ENTITY_USER")
public class EntityUser {
    @EmbeddedId
    private EntityUserId pk;
    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("ID_ENTITY")
    @JoinColumn(name="ID_ENTITY")
    private Entita entity;
    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("ID_USER")
    @JoinColumn(name="ID_USER")
    private User user;
    //Setter, getter, hashcode and equals
}
@Embeddable
public class EntityUserId {
    @Column(name = "id_user")
    private UUID idUser;
    @Column(name = "id_entity")
    private UUID idEntity;
    //Setter, getter, hashcode and equals
}
@Entity
@Table(name="USER_ROLE")
public class UserRole {
    @EmbeddedId
    private UserRoleId pk;
    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("ID_USER")
    @JoinColumn(name="ID_USER")
    private User user;
    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("ID_ROLE")
    @JoinColumn(name="ID_ROLE") 
    private Role role;
    //Setter, getter, hashcode and equals
}
@Embeddable
public class UserRoleId {
    @Column(name = "id_user")
    private UUID idUser;
    @Column(name = "id_role")
    private UUID idRole;
    //Setter, getter, hashcode and equals
    
}
让我们假设:

  • 我需要查询数据库,我需要搜索用户角色名为“所有者”的所有实体和用户

  • 我需要服务器端分页和排序

  • 我需要去掉以下所有属性:

    3.1。entityName来自Entita

    3.2。来自用户的name和lastname

  • 假设有几个用户与一个实体相关

    基本上,我应该使用JPA和QueryDSL编写类似的查询(带分页),并避免与多个关联相关的重复

    select 
      e.ENTITY_NAME,
      u.NAME,
      u.LASTNAME
    from
      entity e
    join ENTITY_USER eu on eu.ID_ENTITY = e.ID_ENTITY
    join USER u on u.ID_USER = eu.ID_USER
    join USER_ROLE ur on ur.ID_USER = u.ID_USER
    join ROLE r on r.ID_ROLE = ur.ID_ROLE
    where
      r.ROLE_NAME = 'OWNER' 
    
    通过避免N+1查询问题和避免加载数据的大量循环,执行查询的最佳方法是什么? 我曾考虑使用
    EntityGraph
    ,但我不确定这是否是最佳选择,也不确定创建参数化
    EntityGraph

    任何提示都欢迎