Я пытаюсь создавать собственные запросы в спящем режиме, и сейчас я использую внутреннее соединение.
Это мой код: Репозиторий филиала:
@Query("select b from Branch b inner join User u ON b.branch_manager = u.id")
List<Branch> findAllBranchInfo();
Отделение службы:
public List<Branch> getAllBranchInfo();
Филиал службы Impl:
@Override
public List<Branch> getAllBranchInfo() {
return (List<Branch>) branchRepository.findAllBranchInfo();
}
Контроллер филиала:
@RequestMapping(value = "/BranchTest", method=RequestMethod.GET)
public ModelAndView testBranch() {
ModelAndView model = new ModelAndView("test_branch");
List<Branch> branchList = branchService.getAllBranchInfo();
model.addObject("branchList",branchList);
return model;
}
Модель отделения:
@Entity
@Table(name = "branch")
public class Branch {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long branch_id;
@Column(name = "branch_name")
private String branch_name;
@Column(name = "branch_manager")
private long branch_manager;
public long getBranch_id() {
return branch_id;
}
public void setBranch_id(long branch_id) {
this.branch_id = branch_id;
}
public String getBranch_name() {
return branch_name;
}
public void setBranch_name(String branch_name) {
this.branch_name = branch_name;
}
public long getBranch_manager() {
return branch_manager;
}
public void setBranch_manager(long branch_manager) {
this.branch_manager = branch_manager;
}
@OneToMany(targetEntity=User.class, mappedBy = "branch",cascade=CascadeType.ALL, fetch = FetchType.LAZY)
private List<User> user;
public List<User> getUser() {
return user;
}
public void setUser(List<User> user) {
this.user = user;
}
}
И прямо сейчас это дает мне эту ошибку:
Hibernate: select branch0_.branch_id as branch_i1_0_, branch0_.branch_manager as branch_m2_0_, branch0_.branch_name as branch_n3_0_ from branch branch0_ inner join user user1_ on (branch0_.branch_manager=user1_.id)
2018-09-25 07:46:04.544 ERROR 1708 --- [nio-8080-exec-1] o.a.c.c.C.[.[localhost].[/].[jsp] : Servlet.service() for servlet [jsp] threw exception
java.lang.NumberFormatException: For input string: "first_name"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[na:1.8.0_181]
at java.lang.Integer.parseInt(Integer.java:580) ~[na:1.8.0_181]
at java.lang.Integer.parseInt(Integer.java:615) ~[na:1.8.0_181]
Я не могу найти его нигде, где я объявил его как Integer.
Это мой jsp:
<c:forEach items = "${branchList }" var = "branch">
<tr>
<td>${branch.branch_name}</td>
<td>${branch.user.first_name}</td>
</tr>
</c:forEach>
Каждый раз, когда я помещаю "$ {branch.user.branch_id}", я получаю сообщение об ошибке. Помогите, пожалуйста. Большое спасибо!
@ sunkuet02 уже добавил это! :)




Рекомендуемый стандартный подход - заменить long на Long. См. jpa-entity-id-long-or-long, чтобы узнать почему?
и проверьте существующие значения базы данных для соответствующих полей вместе с их типом.
Если описанные выше действия не решают проблему, иногда отбрасывайте базу данных и создавайте ее с самого начала из-за несовместимости данных.
на моем модельном классе?
да вместо частного long branch_id; используйте частный Long branch_id; и интересно узнать приватный длинный branch_manager; Branch_manager длинный?
да, потому что это внешний ключ идентификатора в моей пользовательской таблице
Я уже пытался отбросить свою таблицу и изменить ее на «Длинную», но ошибка все та же. Мое отображение неверно? Я несколько дней пытался использовать запрос соединения в запросе и, похоже, не могу этого понять.
На мой взгляд, если вы хотите делать такие вещи в своем jsp, вы должны сделать что-то подобное в своей модели «Ветвь» и модели «Пользователь», я полагаю?
...
@JoinColumn(name = "branch_manager", referencedColumnName = "branch_manager")
@OneToOne(cascade = CascadeType.ALL, mappedBy = "User", fetch = FetchType.LAZY)
private User branch_manager;
...
И похожая на вашу "Юзер" модель
Затем в ваш «Репозиторий веток» добавьте JpaRepository, и я думаю, вам даже не нужно использовать этот метод, просто используйте метод findAll из вашего «Контроллера ветки».
И все должно быть ОК!
Надеюсь, это будет полезно, иначе я не понял ваш вопрос :)
Проблема в том, что в одной ветке много пользователей. branch.user относится к списку пользователей, а не к одному пользователю. Вы должны выполнить итерацию, чтобы получить для каждого пользователя его / ее имя.
1. Переименуйте сбивающий с толку метод getUser() в getUsers(), чтобы лучше выделить связь «один ко многим».
2. Это попытка исправить ваш JSP:
<c:forEach items = "${branchList }" var = "branch">
<tr>
<td>${branch.branch_name}</td>
<c:forEach items = "${branch.users}" var = "user">
<td>${user.first_name}</td>
</c:forEach>
</tr>
</c:forEach>
я думаю что
{users.<n>}, где <n> - целое число, относится к n-му элементу списка пользователей. Вот почему процессор JSP пытается преобразовать first_name в целое число, когда у вас есть такое выражение, как {users.first_name}
Спасибо большое. Я задавал тот же вопрос несколько дней назад, но вы единственный, кто решил мою проблему. спасибо
Не могли бы вы опубликовать свой класс модели веток?