Подтвердить что ты не робот

Представления SQL/Database в Grails

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

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

[Изменить:
Следующий вопрос здесь: Класс домена Grails без поля идентификатора или с частично NULL составным полем

4b9b3361

Ответ 1

Вы можете использовать простой 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>

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

Ответ 2

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

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 работает без видимых проблем.

Ответ 3

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