#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, в которой описывается, как получить доступ к вложенным свойствам и как использовать безопасную навигацию.