#spring-boot
Вопрос:
Я отлично получаю данные из базы данных и передаю их в Thymeleaf(шаблон), но проблема заключается mdl.addAttribute("number" ,request.getNumber())
в том, что контроллер обнаруживает последнее значение из foreach
итерации цикла и отправляет по модели
Вот мой код:
Dto
public interface ProfileDto {
public Integer getU_id();
public Integer getP_id();
public String getEmail();
public String getUsername();
public String getPassword();
public String getContact();
public String getDate();
public String getProfile();
public String getWebsite();
public String getBio();
public String getGender();
public String getPost();
}
Сущность
@Entity
@Table(name = "request_master")
public class Request {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int req_id;
private int sender_id;
private int receiver_id;
private String status;
private String date;
@Transient
private int number;
// getter setter
}
Хранилище
public interface profileRepo extends JpaRepository<Request, Integer> {
@Query(nativeQuery = true, value = "SELECT * FROM registration_master rm INNER JOIN profile_master pm ON rm.u_id = pm.user_id WHERE rm.u_id != ?")
List<ProfileDto> findByIdUser(Integer Id);
public interface requestRepo extends JpaRepository<Request, Integer> {
@Query(nativeQuery = true, value="SELECT * FROM request_master WHERE sender_id = ? and receiver_id = ?")
List<Request> getSuggetionButton(Integer Sender_id, Integer Receiver_id);
}
Обслуживание
@Service
public class ServiceImpl implements Service {
@Autowired
private profileRepo profileRepo;
@Autowired
private requestRepo requestRepo;
@Override
public List<ProfileDto> getSuggestedList(Integer Id) {
return this.profileRepo.findByIdUser(Id);
}
@Override
public List<Request> getSuggestionButton(Integer Sender_id, Integer Receiver_id) {
return this.requestRepo.getSuggetionButton(Sender_id, Receiver_id);
}
}
Controller
@Controller
public class Controller {
@Autowired
private Service service;
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Model mdl, Request request) {
int SessionId = Integer.parseInt(session.getAttribute("uid").toString());
List<ProfileDto> Suggestion_list = service.getSuggestedList(SessionId);
for(ProfileDto Suggestion_id : Suggestion_list)
{
List<Request> Friend_request = this.service.getSuggestionButton(SessionId, Suggestion_id.getU_id());
if(Friend_request.size() > 0)
{
request.setNumber(Friend_request.size());
}
else
{
request.setNumber(0);
}
}
mdl.addAttribute("number" ,request.getNumber());
mdl.addAttribute("suggestionList", Suggestion_list);
return "post";
}
}
Тимелиф
<div class="follow-user-list" th:each="suggetionFriend : ${suggestionList}">
<div class="follow-user clearfix" th:id="'follow-user' ${suggetionFriend.u_id}">
<img th:src="${suggetionFriend.profile}" alt="" class="profile-photo-sm pull-left" />
<div class="name clearfix">
<h5>
<a href="#" class="follow-name" th:text="${suggetionFriend.username}"></a>
</h5>
<div class='follow-unfollow-btn' th:id="'follow-unfollow-button' ${suggetionFriend.u_id}">
<div th:text="${number}">
</div>
</div>
</div>
</div>
</div>
на приведенном ниже изображении
1
указано условие совпадения и поиска данных, а0
также условие не совпадения и не поиска данных
В моих выходных данных я могу получить только данные последней итерации в обоих пользователях
Выход:
Ожидаемый результат:
Я думаю, что проблема заключается в передаче данных с контроллера на thymeleaf
Если у вас есть хорошая идея перевести стоимость с Controller
Template
, скажите мне, пожалуйста
Комментарии:
1. В вашей модели у вас есть один атрибут под названием «число», который вы перезаписываете в цикле… вместо этого вы должны добавить его в свой
profileJoinDto
(или создать новый DTO, содержащий его).2. Кстати: Я бы предложил вам ознакомиться с соглашениями о коде Java (например, типы всегда должны начинаться с прописной буквы). В настоящее время читать ваш код довольно громоздко…
Ответ №1:
Вы должны поддерживать request
для каждого профиля/пользователя вместо одного request
, я имею в виду , что у вас должно быть количество request
для каждого profileId/userId
, вы можете поддерживать карту profileId/userId
и количество request
для этого профиля/пользователя и использовать эту карту в своем template
, попробуйте изменить свой код, как показано ниже
Контроллер
@Controller
public class Controller {
@Autowired
private Service service;
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Model mdl, Request request) {
Map<Integer, Integer> profileToNoOfRequestMap = new HashMap<>();
int SessionId = Integer.parseInt(session.getAttribute("uid").toString());
List<ProfileDto> Suggestion_list = service.getSuggestedList(SessionId);
for(ProfileDto Suggestion_id : Suggestion_list)
{
List<Request> Friend_request = this.service.getSuggestionButton(SessionId, Suggestion_id.getU_id());
profileToNoOfRequestMap.put(Suggestion_id.getU_id(), Friend_request.size());
}
mdl.addAttribute("profileToNoOfRequestMap", profileToNoOfRequestMap);
mdl.addAttribute("suggestionList", Suggestion_list);
return "post";
}
}
Тимелиф
<div class="follow-user-list" th:each="suggetionFriend : ${suggestionList}">
<div class="follow-user clearfix" th:id="'follow-user' ${suggetionFriend.u_id}">
<img th:src="${suggetionFriend.profile}" alt="" class="profile-photo-sm pull-left" />
<div class="name clearfix">
<h5>
<a href="#" class="follow-name" th:text="${suggetionFriend.username}"></a>
</h5>
<div class='follow-unfollow-btn' th:id="'follow-unfollow-button' ${suggetionFriend.u_id}">
<div th:text="${profileToNoOfRequestMap.get(suggetionFriend.u_id)}">
</div>
</div>
</div>
</div>
</div>