Pergunta

Alguém sabe qual é a melhor abordagem para o acesso a uma vista sql através Grails (ou se isso é mesmo possível)? Parece uma maneira óbvia de fazer isso seria usar executeQuery contra a visão para selecionar um conjunto de linhas a partir da visão que não iria tratar como uma lista de objetos de domínio. No entanto, mesmo neste caso, não é óbvio que classe de domínio para executar executeQuery contra, pois realmente estamos apenas usando essa classe de domínio, a fim de executar a consulta contra uma entidade completamente alheios (a vista).

Seria preferível criar uma classe de domínio que representa a vista e nós poderíamos então é só usar list () contra essa classe de domínio? Parece que não haveria problemas com isso como Grails provavelmente espera ser capaz de inserir, atualizar, excluir e modificar o esquema de tabela de qualquer classe de domínio.

[Edit:
Acompanhamento pergunta aqui: Grails Domínio classe sem campo ID ou com o campo compósito parcialmente NULL

Foi útil?

Solução

Você pode usar SQL simples em Grails que é no caso de aceder a uma visão do caminho preferível (IMO):

Por exemplo, em seu controlador:

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
    }

}

ea vista parte:

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

Espero que a fonte é auto-explicativo. A pode ser encontrada aqui

Outras dicas

Você pode colocar isso em seus mapeamentos de classes de domínio:

static mapping = {
    cache 'read-only'
}

Mas eu não tenho certeza se isso ajuda Hibernate entendo que é uma visão ... http://docs.jboss.org/hibernate/stable/core/reference/en/html_single/#performance-cache-readonly

De qualquer forma, usamos visualizações de banco de dados muito como classes de domínio Grails em nosso projeto atual, porque HQL é um pé no saco e é simples de usar SQL para unir tabelas.

Uma coisa que você precisa ter cuidado sobre entanto, é o de lotes Hibernate de consultas (e todo o negócio nivelado). Se você inserir algo em uma mesa, e, em seguida, na mesma transação que você selecionar uma visão de que depende dessa tabela, você não vai obter as últimas linhas que você inseriu. Isso ocorre porque o Hibernate não irá realmente ter inserido as linhas ainda, ao passo que se você selecionou a tabela que você inserido linhas em, Hibernate teria descoberto que precisava para lavar suas consultas pendentes antes de lhe dar o resultado de sua seleção.

Uma solução é (flush:true) ao salvar uma instância de domínio que você sabe que vai precisar de ler através de uma visão posteriormente na mesma transação.

Seria legal, no entanto, têm algum tipo de forma de contar Hibernate que uma visão / domínio depende de qual outras classes de domínio, de modo que a lavagem Hibernate funciona bem seemlessly.

É perfeitamente possível mapear uma classe de domínio para um ponto de vista, apenas tratá-lo como uma tabela regular. Eu acho que Grails irá imprimir algumas mensagens de log sobre não ser capaz de fazer inserções, exclusões, etc., mas não vai jogar todos os erros a menos que você realmente tentar fazer algo diferente de consulta com a classe de domínio.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top