Вопрос

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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 работала без проблем.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top