如何在没有 JPA 实体 class 的情况下使用 JPQL 从映射 table 检索数据
How to retrieve data from mapping table using JPQL without JPA Entity class
我有一个简单的用户实体,它可能有朋友(用户到用户的多对多关系),映射到数据库中的朋友 table,但我没有单独的朋友实体对象进行映射.这是用户实体。
@Entity
@Table(name="users")
public class User extends Persistent{
@NotEmpty
@Size(min=4,max=16)
@Column(name="USER_NAME",nullable = false,unique = true)
private String username;
@NotEmpty
@Email
@Column(name="EMAIL",nullable = false,unique = true)
private String email;
@NotEmpty
@Size(min=3,max=99)
@Column(name="PASSWORD",nullable = false)
private String password;
@Column(name="ACTIVE")
private boolean active = true;
@NotEmpty
@Column(name="FIRST_NAME",nullable = false)
private String firstName;
@NotEmpty
@Column(name="LAST_NAME",nullable = false)
private String lastName;
@NotEmpty
@Column(name="DOB",nullable = false)
private String DOB;
@Column(name="PROFILE_PICTURE")
private String profilePicture;
//user activities
@OneToMany(mappedBy = "user",fetch = FetchType.LAZY,cascade = CascadeType.REMOVE)
private List<Post> posts;
@OneToMany(mappedBy = "user",fetch = FetchType.LAZY,cascade = CascadeType.REMOVE)
private List<Comment> comments;
@OneToMany(mappedBy = "user",fetch = FetchType.LAZY,cascade = CascadeType.REMOVE)
private List<Like> likes;
@ManyToMany(cascade={CascadeType.ALL},fetch=FetchType.EAGER)
@JoinTable(name="friends",
joinColumns={@JoinColumn(name="userId")},
inverseJoinColumns={@JoinColumn(name="friendId")})
private List<User> friends;
@ManyToMany(mappedBy="friends",fetch=FetchType.EAGER)
private List<User> friendsWith;
.....
}
所以,我使用了eager loading来加载User的好友。但是如果我想加载用户的朋友而不急切地加载而是使用 JPQL ...是否可以使用 JPQL 加载用户朋友信息因为我没有朋友实体 class ?我需要创建一个单独的 Friend 实体 class 来映射好友吗??
实体之间存在关联。可以使用获取连接在 JPQL 中急切地加载关联:
select distinct u from User u left join fetch u.friends where u.id = :id
这适用于任何关联,无论其映射方式如何。
我有一个简单的用户实体,它可能有朋友(用户到用户的多对多关系),映射到数据库中的朋友 table,但我没有单独的朋友实体对象进行映射.这是用户实体。
@Entity
@Table(name="users")
public class User extends Persistent{
@NotEmpty
@Size(min=4,max=16)
@Column(name="USER_NAME",nullable = false,unique = true)
private String username;
@NotEmpty
@Email
@Column(name="EMAIL",nullable = false,unique = true)
private String email;
@NotEmpty
@Size(min=3,max=99)
@Column(name="PASSWORD",nullable = false)
private String password;
@Column(name="ACTIVE")
private boolean active = true;
@NotEmpty
@Column(name="FIRST_NAME",nullable = false)
private String firstName;
@NotEmpty
@Column(name="LAST_NAME",nullable = false)
private String lastName;
@NotEmpty
@Column(name="DOB",nullable = false)
private String DOB;
@Column(name="PROFILE_PICTURE")
private String profilePicture;
//user activities
@OneToMany(mappedBy = "user",fetch = FetchType.LAZY,cascade = CascadeType.REMOVE)
private List<Post> posts;
@OneToMany(mappedBy = "user",fetch = FetchType.LAZY,cascade = CascadeType.REMOVE)
private List<Comment> comments;
@OneToMany(mappedBy = "user",fetch = FetchType.LAZY,cascade = CascadeType.REMOVE)
private List<Like> likes;
@ManyToMany(cascade={CascadeType.ALL},fetch=FetchType.EAGER)
@JoinTable(name="friends",
joinColumns={@JoinColumn(name="userId")},
inverseJoinColumns={@JoinColumn(name="friendId")})
private List<User> friends;
@ManyToMany(mappedBy="friends",fetch=FetchType.EAGER)
private List<User> friendsWith;
.....
}
所以,我使用了eager loading来加载User的好友。但是如果我想加载用户的朋友而不急切地加载而是使用 JPQL ...是否可以使用 JPQL 加载用户朋友信息因为我没有朋友实体 class ?我需要创建一个单独的 Friend 实体 class 来映射好友吗??
实体之间存在关联。可以使用获取连接在 JPQL 中急切地加载关联:
select distinct u from User u left join fetch u.friends where u.id = :id
这适用于任何关联,无论其映射方式如何。