簡體   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