Как мне восстановить данные из таблицы вложенных полей в моем проекте Spring Boot?

#java #spring-boot #thymeleaf #hibernate-onetomany

Вопрос:

У меня есть две сущности «Пользователь» и «Пользователь», которые имеют отношение как Одно ко многим. Я хочу показать их в одной таблице, где у моего пользователя будут отображаться все поля, и только одно поле будет из «UserOtp». Ниже приведен код сведений.

«Пользователь»

 import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import com.fasterxml.jackson.annotation.JsonIgnore;

@Entity
@Table(name = "users")
public class Users {
    
    @Id
    @Column(name = "userid")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @JsonIgnore
    private int userid;
    private String msisdn;
    private String userPin;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "iduser_role")
    private UserRole roleId;
    
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "ud_id")
    private DeviceProfile deviceProfile;
    
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "pp_id")
    private PersonalProfile personalProfile;
    
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "pa_id")
    private PersonalAccount personalAccount;
    
    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "userid")
    List<UserOtp> userOtp;
    
    @JsonIgnore
    private int status;
    @JsonIgnore
    private Date createDate;
    @JsonIgnore
    private Date updateDate;
    
    public Users() {
    }

    public Users(String msisdn, String userPin, UserRole roleId, DeviceProfile deviceProfile,
            PersonalProfile personalProfile, PersonalAccount personalAccount, List<UserOtp> userOtp, int status,
            Date createDate, Date updateDate) {
        super();
        this.msisdn = msisdn;
        this.userPin = userPin;
        this.roleId = roleId;
        this.deviceProfile = deviceProfile;
        this.personalProfile = personalProfile;
        this.personalAccount = personalAccount;
        this.userOtp = userOtp;
        this.status = status;
        this.createDate = createDate;
        this.updateDate = updateDate;
    }

--- Getter and Setter --- 
 

«UserOTP»

 import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "user_otp")
public class UserOtp {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "iduser_otp")
    private int iduserOtp;
    private String otp;
    private Date createDate;
    private Date updateDate;
    private int status;
    
    public UserOtp() {
    }

    public UserOtp(String otp, Date createDate, Date updateDate, int status) {
        super();
        this.otp = otp;
        this.createDate = createDate;
        this.updateDate = updateDate;
        this.status = status;
    }

------ Getter and Setter -----
 

«Контроллер»

 @RequestMapping("/admin/index")
    public String Login(Model model) {
        
        long countUsers = userRepositoryService.countUsers();
        
        Users user = userRepositoryService.getUsers(1);
        
        List<Users> users = userRepositoryService.getUsers();
        
        model.addAttribute("usersCount", countUsers);
        model.addAttribute("users", users);
        
        System.out.println(user.getUserOtp().toString());
        
        return "/admin/index";
    }
 

Страница Тимелифа

 <table class="table table-bordered table-striped">
                        <thead>
                          <tr>
                            <th>#</th>
                            <th>Username</th>
                            <th>OTP</th>
                            <th>Gen. Time</th>
                            <th>Update Time</th>
                            <th>Status</th>
                          </tr>
                        </thead>
                        <tbody>
                          <tr class="odd gradeX" th:each="user : ${users}">
                            <td th:text="${user.userid}">01</td>
                            <td th:text="${user.msisdn}">01791631664</td>
                            <td th:text="${user.userOtp}">6566</td>
                            <td th:text="${user.CreateDate}">July 12, 2012 12:13:00 PM</td>
                            <td th:text="${user.UpdateDate}">July 12, 2012 12:13:00 PM</td>
                            <th th:text="${user.status}">Active</th>
                          </tr>
                        </tbody>
                      </table>
 

И результат, который я получаю, находится ниже:

введите описание изображения здесь

Я просто хочу показать только последние данные в поле «otp».

Комментарии:

1. Фактический результат отсутствует.

Ответ №1:

Вы можете перемещаться по объектам с помощью Spring EL, используя символ точки («.»).

Итак, в вашем случае, если вы хотите отобразить только поле статуса, вы можете использовать:

     <td th:text="${user.userOtp.status}">6566</td>
 

Для получения дополнительной информации вы можете ознакомиться с разделом 1 документации Spring MVC и Thymeleaf, чтобы узнать о Spring EL.

Кроме того, вы также можете найти полезной главу 4.3.2 документации Spring, в которой описывается, как получить доступ к вложенным свойствам и как использовать безопасную навигацию.