我正在使用 Spring Data JPA 和 Hibernate 映射開發 Spring Boot 專案。我對如何實作以下查詢有以下疑問。
我有一個像這樣的用戶物體類:
@Entity
@Table(name = "portal_user")
@Getter
@Setter
public class User implements Serializable {
private static final long serialVersionUID = 5062673109048808267L;
@Id
@Column(name = "id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
@Column(name = "first_name")
@NotNull(message = "{NotNull.User.firstName.Validation}")
private String firstName;
@Column(name = "middle_name")
private String middleName;
@Column(name = "surname")
@NotNull(message = "{NotNull.User.surname.Validation}")
private String surname;
@Column(name = "sex")
@NotNull(message = "{NotNull.User.sex.Validation}")
private char sex;
@Column(name = "birthdate")
@NotNull(message = "{NotNull.User.birthdate.Validation}")
private Date birthdate;
@Column(name = "tax_code")
@NotNull(message = "{NotNull.User.taxCode.Validation}")
private String taxCode;
@Column(name = "e_mail")
@NotNull(message = "{NotNull.User.email.Validation}")
private String email;
@Column(name = "pswd")
@NotNull(message = "{NotNull.User.pswd.Validation}")
private String pswd;
@Column(name = "contact_number")
@NotNull(message = "{NotNull.User.contactNumber.Validation}")
private String contactNumber;
@Temporal(TemporalType.DATE)
@Column(name = "created_at")
private Date createdAt;
@Column(name = "is_active")
private boolean is_active;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "user", orphanRemoval = true)
@JsonManagedReference
private Set<Address> addressesList = new HashSet<>();
@ManyToMany(cascade = { CascadeType.MERGE })
@JoinTable(
name = "portal_user_user_type",
joinColumns = { @JoinColumn(name = "portal_user_id_fk") },
inverseJoinColumns = { @JoinColumn(name = "user_type_id_fk") }
)
Set<UserType> userTypes;
@ManyToOne(fetch = FetchType.EAGER)
@JsonProperty("subagent")
private User parent;
public User() {
super();
}
public User(String firstName, String middleName, String surname, char sex, Date birthdate, String taxCode,
String email, String pswd, String contactNumber, Date createdAt, boolean is_active) {
super();
this.firstName = firstName;
this.middleName = middleName;
this.surname = surname;
this.sex = sex;
this.birthdate = birthdate;
this.taxCode = taxCode;
this.email = email;
this.pswd = pswd;
this.contactNumber = contactNumber;
this.createdAt = createdAt;
this.is_active = is_active;
}
}
此類的實體代表我系統的用戶。一個用戶可以有一個特定的父母(這個概念類似于推薦的概念:一個用戶可以在系統中帶來另一個用戶)。這是由這個ManyToOne遞回關系處理的:
@ManyToOne(fetch = FetchType.EAGER)
@JsonProperty("subagent")
private User parent;
基本上用戶包含的是父母(將他\她帶入平臺)。它作業正常。因此,檢索用戶我可以輕松檢索誰是其父級的資訊(它包含在檢索到的 User 物件中)。
現在我需要實作相反的行為:我必須定義一個從父級開始檢索其所有子級的“查詢”。
前面的User物體類映射以下 DB 表:

熒光筆parent_id包含定義此遞回關系的 FK。所以它包含另一個作為父母的用戶的 PK。
我有這個UserRepository存盤庫介面(它擴展了JpaRepository介面)
public interface UsersRepository extends JpaRepository<User, Integer> {
User findByemail(String email);
List<User> findByUserTypes_TypeName(String typeName);
}
如您所見,我使用的是“按方法查詢”樣式。是否有可能使用“按方法查詢”樣式實作這樣的行為?(以防JPQL也可以)
uj5u.com熱心網友回復:
你可以這樣做
List<User> findByParent_Id(Integer id);
或者你可以這樣做
@Query("SELECT u FROM User u WHERE u.id = ?1")
List<User> getReferredUsers(Integer id);
uj5u.com熱心網友回復:
在給定的代碼中,用戶和父級之間的關系是單向的。通過使其雙向,可以輕松地以任何一種方式查詢資料。
請參閱下面的代碼以使其成為雙向的。還要確保相關的 FetchType 以避免性能風險。這里 FetchType.LAZY 用于一對多關聯,因此它在需要時使用代理參考查詢資料。
@ManyToOne(fetch = FetchType.EAGER)
@JsonProperty("subagent")
@JsonBackReference
private User parent;
@JsonManagedReference
@OneToMany(fetch = FetchType.LAZY, mappedBy = "parent")
private Set<User> userSet = new HashSet<>();
由于 FetchType.Lazy,僅在使用 parent.getUserSet 時才獲取子物體
public Set<User> getUsers(int id) {
User parent = userRepository.getById(id);
return parent.getUserSet();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/406476.html
標籤:
上一篇:在我的表中插入新行不起作用
