繁体   English   中英

如何在 SpringBoot 中使用另一个实体搜索一个实体(在地图中)?

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM