带分页的JPA连接
我使用的是SpingBoot2.4.5和SpringDataJPA(hibernate实现) 我有一个与下图非常相似的DB 我写了以下几个实体 实体模型类:带分页的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
@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
}
让我们假设:
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
任何提示都欢迎