Представления SQL / базы данных в Grails - PullRequest
26 голосов
/ 08 января 2009

Кто-нибудь знает, каков наилучший подход к доступу к представлению SQL через Grails (или, если это вообще возможно)? Кажется очевидным способом сделать это было бы использовать executeQuery против представления, чтобы выбрать набор строк из представления, которые мы не будем рассматривать как список объектов домена. Однако даже в этом случае неясно, с каким классом домена запускать executeQuery, поскольку на самом деле мы просто используем этот класс домена для выполнения запроса к совершенно не связанной сущности (представление).

Было бы предпочтительнее создать класс домена, представляющий представление, и тогда мы могли бы просто использовать list () для этого класса домена? Похоже, что с этим возникнут проблемы, поскольку Grails, вероятно, рассчитывает вставить, обновить, удалить и изменить схему таблиц любого класса домена.

[Изменить:
Дополнительный вопрос здесь: Класс домена Grails без поля ID или с частично пустым составным полем

Ответы [ 3 ]

34 голосов
/ 08 января 2009

Вы можете использовать простой SQL в Grails, который в случае доступа к представлению предпочтительным способом (IMO):

Например, в вашем контроллере:

import groovy.sql.Sql

class MyFancySqlController {

    def dataSource // the Spring-Bean "dataSource" is auto-injected

    def list = {
        def db = new Sql(dataSource) // Create a new instance of groovy.sql.Sql with the DB of the Grails app

        def result = db.rows("SELECT foo, bar FROM my_view") // Perform the query

        [ result: result ] // return the results as model
    }

}

и часть просмотра:

<g:each in="${result}">
    <tr>
        <td>${it.foo}</td>
        <td>${it.bar}</td>
    </tr>
</g:each>

Я надеюсь, что источник говорит само за себя. Документацию можно найти здесь

4 голосов
/ 22 июля 2009

Вы можете поместить это в сопоставления классов вашего домена:

static mapping = {
    cache 'read-only'
}

Но я не уверен, поможет ли это Hibernate понять, что это вид ... http://docs.jboss.org/hibernate/stable/core/reference/en/html_single/#performance-cache-readonly

В любом случае, мы часто используем представления базы данных в качестве классов домена grails в нашем текущем проекте, потому что HQL - трудная задача, и для объединения таблиц проще использовать SQL.

Одна вещь, с которой вам следует быть осторожным, это пакетная обработка запросов Hibernate (и весь процесс очистки). Если вы вставляете что-то в таблицу, а затем в той же транзакции выбираете представление, зависящее от этой таблицы, вы не получите последние вставленные строки. Это связано с тем, что Hibernate на самом деле еще не вставил строки, тогда как если бы вы выбрали таблицу, в которую вы вставили строки, Hibernate выяснил бы, что нужно сбросить ожидающие запросы, прежде чем дать вам результат вашего выбора.

Одним из решений является (flush:true) при сохранении экземпляра домена, который, как вы знаете, должен будет впоследствии просмотреть представление в той же транзакции.

Было бы здорово, однако, иметь какой-то способ сказать Hibernate, что представление / домен зависит от того, какие другие классы домена, так что сброс Hibernate работает хорошо без всяких проблем.

2 голосов
/ 09 января 2009

Совершенно возможно отобразить класс домена на представление, просто обработайте его как обычную таблицу. Я думаю, что Grails напечатает некоторые сообщения журнала о невозможности вставки, удаления и т. Д., Но не выдаст никаких ошибок, если вы на самом деле не попытаетесь сделать что-то кроме запроса с классом домена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...