Relacionar campos de modelo de arranque por resorte de lista de listas con Thymeleaf

Soy nuevo en StackOverflow y he odiado la idea de hacer una pregunta, ya que he visto tantos derribados en llamas que me preguntaron mal o respondieron en otro lado, pero parece que no puedo encontrar una respuesta sin importar cómo Me esfuerzo mucho. ¡Aquí va!

Tengo los siguientes modelos en una aplicación Spring-Boot:

public class Timesheet {

    //some straightforward getters/setters (e.g. id)

    public List<TimesheetRow> getTimesheetRow() {
        return timesheetRow;
    }

    public void setTimesheetRow(List<TimesheetRow> timesheetRow) {
        this.timesheetRow = timesheetRow;
    }
}

public class TimesheetRow {

    //some straightforward getters/setters (e.g. rowId)

    public List<TimesheetTask> getTimesheetTask() {
        return timesheetTask;
    }

    public void setTimesheetTask(List<TimesheetTask> timesheetTask) {
        this.timesheetTask = timesheetTask;
    }
}

public class TimesheetTask {

    //some straightforward getters/setters (e.g. taskId)

}

Con suerte, hasta ahora todo bien, y he escrito las capas de Servicio y DAO para recuperar los datos apropiados: he escrito manualmente algunos datos en la base de datos y validado que cuando llamo a los métodos de acceso, se devuelven los datos correctos.

Sin embargo, se presenta un problema cuando intento representar estos datos con Thymeleaf. El código que tengo hasta ahora es así (disculpe el terrible formato, solo estoy tratando de que funcione antes de ordenar la estructura de la tabla):

 <table>
     <tr th:each="row,iteration : ${timesheet.timesheetRow}">
         <td>
              <!--This part actually works. Huzzah!-->
              <input type="hidden" th:field="*{timesheetRow[__${iteration.index}__].id}"/>
              <input type="text" th:field="*{timesheetRow[__${iteration.index}__].projectId}" />
         </td> 
         <td>
         <span th:each="task,iteration2 : ${row.timesheetTask}">

              <!--These two lines are particularly poor, and are just my futile attempts at trying different ways to try and reference appropriately. Sorry.-->
              <input type="hidden" th:field="*{timesheetRow.get(__${iteration.index}__).getTimesheetTask.get(__${iteration2.index}__).getId()}"/>
              <input type="text" th:field="*{task.work}"/>

         </span>
         </td>
     </tr>
 </table>

Intenté resolver esto yo mismo basándome en las siguientes respuestas:

bucle anidado (doble) con hoja de tomillo

¿Cómo vincular una lista de objetos con thymeleaf?

... pero si bien el primero habla de "dos capas de profundidad", parece que no puedo acceder a la segunda capa hacia abajo, es decir, las Tareas de hoja de horas en cada fila de hoja de horas individual.

Por lo que puedo decir, el código conceptual que intento es algo similar a

timesheet.timesheetRow[0].timesheetTask[0] 

o similar, pero esta es obviamente una sintaxis horrible que Java no reconoce, por lo que es muy probable que ThymeLeaf no haga nada con ella.

Esto puede ser completamente imposible usando ThymeLeaf y estoy considerando refactorizar el código para agregar todos los campos de Tarea a la Fila de la hoja de tiempo, pero ¿es esto posible? Si es así, ¿cómo podría lograrse?

¡Muchas gracias de antemano, y cualquier comentario sobre cómo podría mejorar mi técnica de preguntas para el día oscuro cuando tengo que hacer otra pregunta llega será muy apreciado!

Respuesta 1

Por defecto, la versión requerida de Hamcrest para: JUnit 4.11 Hamcrest 1.3 Mockito-core 1.9.5 Hamcrest 1.1 No hubo cambios de API insignificantes entre Hamcrest 1.1 y 1.3. Actualmente mi prueba ...

Estoy tratando de entender la configuración de la matriz en Java. ¿Por qué debe inicializar el espacio para cada objeto en la matriz, después de haber creado la matriz? ¿Cómo se almacena en la memoria de esta manera: [objeto] [...

En una entrevista, me pidieron que verificara si el siguiente código funciona según lo previsto. ConcurrentHashMap <Integer, Integer> chm = new ConcurrentHashMap <> (); if (chm.get (key)! = null) {chm ....

La compilación escalonada de HotSpot utiliza el intérprete hasta que un umbral de invocaciones (para métodos) o iteraciones (para bucles) desencadena una compilación del cliente con autoperforación. La compilación del cliente es ...