[英]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.