Cuando creo una consulta en squeryl, devuelve un objeto Query [T]. La consulta aún no se ejecutó y será, cuando itere sobre el objeto Query (Query [T] extends Iterable [T]).Squeryl: ejecutar consulta explícitamente
Alrededor de la ejecución de una consulta tiene que haber una transacción {} o un bloque inTransaction {}.
Estoy hablando de consultas SELECT y las transacciones no serían necesarias, pero el marco de squeryl las necesita.
Me gustaría crear una consulta en el modelo de mi aplicación y pasarla directamente a la vista donde un asistente de visualización en la plantilla itera sobre ella y presenta los datos. Esto solo es posible cuando se coloca el bloque {} de transacción en el controlador (el controlador incluye la llamada de la plantilla, por lo que la plantilla que realiza la iteración también está dentro). No es posible poner el bloque {} de transacción en el modelo, porque el modelo realmente no ejecuta la consulta.
Pero a mi entender, la transacción no tiene nada que ver con el controlador. Es una decisión del modelo qué marco de base de datos usar, cómo usarlo y dónde usar las transacciones. Por lo tanto, quiero que el bloque transaction {} esté en el modelo.
Sé que puedo, en lugar de devolver la instancia de Query [T], invocar Iterable [T] .toList en este objeto Query [T] y luego devolver la lista creada. Entonces toda la consulta se ejecuta en el modelo y todo está bien. Pero no me gusta este enfoque, porque todos los datos solicitados de la base de datos deben almacenarse en caché en esta lista. Prefiero una forma en que estos datos se pasen directamente a la vista. Me gusta la función MySql de transmitir el conjunto de resultados cuando es grande.
¿Hay alguna posibilidad? Tal vez algo así como una función Query [T] .executeNow() que envía la solicitud a la base de datos, puede cerrar la transacción, pero aún utiliza la función de transmisión MySQL y recibe el resto del conjunto de resultados (seleccionado y por lo tanto fijo) cuando se accede? Debido a que el conjunto de resultados se soluciona en el momento de la consulta, el cierre de la transacción no debería ser un problema.
Sería bueno que publicaras tu solución, en caso de que encuentres una interesante/sorprendente. –