Squeryl: Явный запуск запроса

Когда я создаю запрос в squeryl, он возвращает объект Query[T]. Запрос еще не был выполнен и будет выполнен, когда я переберу объект Query (Query[T] extends Iterable[T]).

Во время выполнения запроса должен быть либо блок transaction{}, либо блок inTransaction{}.

Я просто говорю о том, что запросы SELECT и транзакции не нужны, но они нужны фреймворку squeryl.

Я хотел бы создать запрос в модели моего приложения и передать его непосредственно в представление, где помощник представления в шаблоне перебирает его и представляет данные. Это возможно только при размещении блока transaction{} в контроллере (контроллер включает в себя вызов шаблона, поэтому шаблон, который выполняет итерацию, также находится внутри). Невозможно поместить блок transaction{} в модель, потому что модель на самом деле не выполняет запрос.

Но в моем понимании транзакция не имеет ничего общего с контроллером. Модель решает, какую структуру базы данных использовать, как ее использовать и где использовать транзакции. Поэтому я хочу, чтобы блок transaction{} был в модели.

Я знаю, что могу вместо возврата экземпляра Query[T] вызвать Iterable[T].toList для этого объекта Query[T] и затем вернуть созданный список. Затем весь запрос выполняется в модели и все в порядке.Но мне такой подход не нравится, потому что все запрашиваемые из БД данные приходится кэшировать в этом списке. Я бы предпочел способ, при котором эти данные напрямую передаются в представление. Мне нравится функция MySql для потоковой передачи набора результатов, когда он большой.

Есть ли возможность? Может быть, что-то вроде функции Query[T].executeNow(), которая отправляет запрос в базу данных, может закрыть транзакцию, но по-прежнему использует функцию потоковой передачи MySQL и получает остальную часть (выбранного и, следовательно, фиксированного) набора результатов, когда к нему обращаются? Поскольку набор результатов фиксируется в момент запроса, закрытие транзакции не должно быть проблемой.

5
задан Heinzi 16 June 2012 в 22:10
поделиться