[英]How can I search one Entity(in a Map) with an other Entity in SpringBoot?
我有一個實體“用戶”和一個實體“工人”。 現在實體工作人員有一個 map “timeMap”,其中存儲了 <LocalTime, User>。
“用戶”應該在某個時間用驗證碼“預訂”一個工人。 然后,“工人”可以看到哪個“用戶”在什么時間注冊了,“用戶”可以看到他在什么時候向哪個“工人”注冊了。
用戶類:
@Entity
public class User implements Serializable {
@Id
@Column(name = "user_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String firstname;
private String surename;
private String email;
@Column(unique = true, name = "authCode")
private String authCode;
@SuppressWarnings("unused")
public User() {
}
public User (String firstname, String surename, String email, String authCode) {
this.firstname= firstname;
this.surename= surename;
this.email = email;
this.authCode = authCode;
}
...
}
工人階級:
@Entity
public class Worker implements Serializable {
@Id
@GeneratedValue
private long id;
@Column(unique = true, name = "worker_id")
private String username;
private String firstname;
private String surename;
private String email;
private String password;
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "users_roles", joinColumns = @JoinColumn(name = "worker_id"),
inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles = new HashSet<>();
@OneToMany(cascade = CascadeType.ALL)
private Map<LocalTime, User> timeList;
@SuppressWarnings("unused")
public Worker() {
}
public Worker(String firstname, String surename, String email, String password, Set<Role> roles) {
this.firstname = firstname;
this.surename = surename;
this.email = email;
this.password = password;
this.roles = roles;
this.username = createUsername();
}
...
在存儲庫中(或稍后在我的服務類中)編寫方法以搜索具有“用戶”的所有工作人員並返回包含所有預訂時間和用戶擁有的工作人員的 Map<LocalTime, Worker> 的最佳方法是什么預定?
例如,用戶輸入他的驗證碼。 這將在 UserRepository 中搜索用戶實體。 這現在應該用於在 WorkerRepository 中搜索用戶及其時間的所有 Worker 實體的所有 map 條目。
例如
Worker1 的 Map-> (5:00, User1; 5:10, User2; 5:20, User3)
Worker2 的 Map-> (5:20, User1; ....)
User1 的結果:User1 --> (5:00, Worker1; 5:20, Worker2)
這應該可以工作(如果您的項目在 Java / JDK 版本 1.8+ 上運行)。 我無法測試它。 我希望這對你有用:
User userToUseAsFilter = /*<The user reference you want to search for>*/;
Map<LocalTime, Worker> map =
workerList.stream()
.flatMap(w -> w.getTimeList().entrySet().stream()
.map(ue -> new EntryHolder(w, ue.getKey(), ue.getValue())))
.filter(eh -> Objects.equals(eh.user, userToUseAsFilter))
.collect(Collectors.toMap(
eh -> eh.time,
eh -> eh.worker,
(w1, w2) -> w1 // Cannot combine two workers into one instance, therefore just ignore worker 2 if they both have the same local time
));
您還需要以下 class 來臨時保存一些值:
public class EntryHolder {
public final Worker worker;
public final LocalTime time;
public final User user;
public EntryHolder(Worker worker, LocalTime time, User user) {
this.worker = worker;
this.time = time;
this.user = user;
}
}
您還應該在用戶 class 中添加一個 equals 方法,以便在 map 中實際找到用戶(我使用 IntelliJ 中的生成功能自動生成這兩種方法):
public class User implements Serializable {
... // All of your fields are here
// Auto generated using IntelliJ:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return id == user.id && Objects.equals(firstname, user.firstname) && Objects.equals(surename,
user.surename) && Objects
.equals(email, user.email) && Objects.equals(authCode, user.authCode);
}
// Auto generated using IntelliJ:
@Override
public int hashCode() {
return Objects.hash(id, firstname, surename, email, authCode);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.