#java
#java
Вопрос:
Надеюсь, у вас все отлично.
Прошу прощения за название, но английский не мой родной язык, и я не знаю, как лучше выразить свою проблему. Итак, в основном у меня есть проект, в котором мы создадим планировщик проектов, который в основном состоит в разделении проектов на подпроекты и задачи. Сейчас я работаю над частью подпроекта, где я хочу отобразить задачи с одинаковыми идентификаторами подпроектов в таблице HTML.
Я создал SQL-запрос, который собирает subprojectname subprojectid и taskname, которые объединяются по subprojectid и упорядочиваются по subprojectid, tasks. Теперь я хочу добавить это в ArrayList подпроектов, конструктор которых имеет список задач. Ниже приведен мой код.
public SubProject(int subProjectID, String subProjectName, ArrayList<Task> tasks){
this.subProjectName = subProjectName;
this.subProjectID = subProjectID;
this.tasks = tasks;
}
public Task(String taskName) {
this.taskName = taskName;
}
Выше приведены мои классы моделей для задач и подпроектов.
public ArrayList<SubProject> getEntireSubProject(){
ArrayList<SubProject> listToReturn = new ArrayList<>();
ArrayList<Task> listOfTask = new ArrayList<>();
try {
PreparedStatement ps = connection.establishConnection().prepareStatement("select idsubprojects, subprojectname, taskName n"
"from subprojects n"
"inner join tasks n"
"on subprojects.idsubprojects = tasks.subprojectidn"
"order by idsubprojects, idtasks");
ResultSet rs = ps.executeQuery();
int SPIDcompare = -1;
while (rs.next()){
if(SPIDcompare == rs.getInt(1)){
listOfTask.add(new Task(rs.getString(3)));
listToReturn.add(new SubProject(rs.getInt(1), rs.getString(2), listOfTask));
}else{
SPIDcompare = rs.getInt(1);
listOfTask.add(new Task(rs.getString(3)));
listToReturn.add(new SubProject(rs.getInt(1), rs.getString(2), listOfTask));
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return listToReturn;
}
Выше приведен мой класс репозитория, в котором я пытаюсь добавить данные SQL в списки. Вывод SQL-запроса:
‘4’,’spName’,’TaskName’
‘4’,’spName’,’TaskName’
‘4’,’spName’,’TaskName’
‘4’,’spName’,’TaskName’
‘6’,’subProjectTest’,’Test’
‘8’,’Все еще работает?’,’doSomething’
Все это записи, которые я сделал. Чего я хочу добиться, так это добавить все задачи, в которых SPID (subprojectid) совпадает с одним и тем же объектом подпроекта, и если SPID изменится, я хотел бы создать новый объект подпроекта в списке для добавления этих данных. Очевидно, что я делаю это неправильно прямо сейчас, так как когда SPID == rs.getInt(1) я создаю новый объект подпроекта, но я действительно не могу понять, как это сделать. Я надеюсь, что кто-нибудь сможет мне помочь
Результатом, которого я пытаюсь достичь, является arraylist, который содержит x количество подпроектов с его subprojectID и соответствующим subprojectname, а также список задач. Итак, с записями из моей базы данных, которые я написал выше, я бы ожидал следующего arraylist
ArrayList(
подпроект (4, spName, ArrayList(TaskName, TaskName, TaskName, TaskName, TaskName))
Подпроект (6, subProjectTest, ArrayList(Test))
Подпроект (8, все еще работает?, ArrayList(doSomething)))
Я хочу, чтобы этот список подпроектов отображался в таблице HTML следующим образом:
РЕДАКТИРОВАТЬ: с помощью @TimonNetherlands я создал представление, которое выглядит следующим образом. Я хочу видеть таблицу HTML thymeleaf для каждого подпроекта, где каждая строка представляет собой одну задачу. Прямо сейчас я могу сделать так, чтобы это выглядело следующим образом с помощью этого кода:
EDIT2: я перепутал thymeleaf, он работает. Благодаря @TimonNetherlands
<div th:if=${!#lists.isEmpty(test)} class="taskTable">
<div th:each="test : ${test}">
<table class="showTasks" >
<tr>
<th>Sub project name</th>
<th>Task name</th>
</tr>
<tr th:each="test1 : ${test.tasks}">
<td th:text="${test.subProjectName}"></td>
<td th:text="${test1.taskName}"></td>
</tr>
</table>
</div>
</div>
Комментарии:
1. Не могли бы вы рассказать подробнее о своем ожидаемом результате? Каким вы ожидаете результата?
2. Конечно, извините! Я отредактировал исходное сообщение
Ответ №1:
SPIDcompare == rs.getInt(1)
никогда не будет true
.
Удалить
ArrayList<Task> listOfTask = new ArrayList<>();
Изменить
int SPIDcompare = -1;
while (rs.next()){
if(SPIDcompare == rs.getInt(1)){
listOfTask.add(new Task(rs.getString(3)));
listToReturn.add(new SubProject(rs.getInt(1), rs.getString(2), listOfTask));
}else{
SPIDcompare = rs.getInt(1);
listOfTask.add(new Task(rs.getString(3)));
listToReturn.add(new SubProject(rs.getInt(1), rs.getString(2), listOfTask));
}
}
в:
while (rs.next()){
SubProject subProject = getSubProject(rs.getInt(1), listToReturn);
if( subProject == null ){
ArrayList<Task> listOfTask = new ArrayList<>();
listOfTask.add(new Task(rs.getString(3)));
listToReturn.add(new SubProject(rs.getInt(1), rs.getString(2), listOfTask));
}else{
subProject.getTasks().add( new Task(rs.getString(3) );
// or subProject.tasks.add( new Task(rs.getString(3) ) if you don't have a getter
}
}
Добавьте этот метод:
private SubProject getSubProject( int subProjectID, List<SubProject> subProjects) {
return subProjects.stream()
// change 'p.getSubProjectID()' into 'p.subProjectID' if you don't have a getter
.filter( p -> p.getSubProjectID() == subProjectID )
.findFirst()
.orElse( null );
}
Комментарии:
1. Привет, Тимон, и спасибо за ваш ответ! Я попытался реализовать ваш код. Я поместил getSubProject в свой класс репозитория — это правильно? Если это так, он возвращает null .
2. Я также обновил исходное сообщение тем, что я ожидаю в качестве результата, если это изменит ваши мысли
3. Я допустил ошибку ввода. Я написал
subProjectId
вместоsubProjectID
. Можете ли вы проверить, работает ли это, когда вы вносите необходимые исправления?4. На самом деле я сам внес эти исправления в ваше первое издание ответа. К сожалению, он по-прежнему не работает и возвращает исключение нулевого указателя. Я попробую отладчик и попробую посмотреть, смогу ли я определить, почему
5. Вы могли бы вернуть необязательное значение в getSubProject вместо управления нулевым значением