Pregunta

¿Alguien sabe cuál es el mejor enfoque para acceder a una vista sql a través de Grails (o si esto es posible)? Parece que una forma obvia de hacer esto sería usar executeQuery en la vista para seleccionar una colección de filas de la vista que no trataríamos como una lista de objetos de dominio. Sin embargo, incluso en este caso, no es obvio en qué clase de dominio ejecutar executeQuery, ya que realmente solo estamos usando esa clase de dominio para ejecutar la consulta en una entidad completamente no relacionada (la vista).

¿Sería preferible crear una clase de dominio que represente la vista y luego podríamos usar list () contra esa clase de dominio? Parece que habría problemas con esto, ya que Grails probablemente espera poder insertar, actualizar, eliminar y modificar el esquema de tabla de cualquier clase de dominio.

[Editar:
Pregunta de seguimiento aquí: Grails Domain Clase sin campo ID o con campo compuesto parcialmente NULL

¿Fue útil?

Solución

Puede usar SQL simple en Grails, que es en el caso de acceder a una vista de la manera preferible (IMO):

Por ejemplo en su 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
    }

}

y la parte de vista:

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

Espero que la fuente se explique por sí misma. La la documentación se puede encontrar aquí

Otros consejos

Puede poner esto en sus asignaciones de clase de dominio:

static mapping = {
    cache 'read-only'
}

Pero no estoy seguro de si ayuda a Hibernate a comprender que es una vista ... http://docs.jboss.org/hibernate/stable/core/reference/en/html_single/#performance-cache-readonly

De todos modos, usamos mucho las vistas de bases de datos como clases de dominio de Grails en nuestro proyecto actual, porque HQL es una molestia y es más simple usar SQL para unir tablas.

Sin embargo, una cosa que debe tener cuidado es el procesamiento por lotes de consultas de Hibernate (y todo el negocio de vaciado). Si inserta algo en una tabla y luego, en la misma transacción, selecciona una vista que depende de esa tabla, no obtendrá las últimas filas que insertó. Esto se debe a que Hibernate aún no ha insertado las filas, mientras que si seleccionó la tabla en la que insertó las filas, Hibernate habría descubierto que necesitaba eliminar sus consultas pendientes antes de darle el resultado de su selección.

Una solución es ( flush: true ) al guardar una instancia de dominio que sabe que tendrá que leer a través de una vista a partir de entonces en la misma transacción.

Sin embargo, sería genial tener algún tipo de forma de decirle a Hibernate que una vista / dominio depende de qué otras clases de dominio, de modo que el enjuague de Hibernate funcione bien aparentemente.

Es perfectamente posible asignar una clase de dominio a una vista, simplemente trátela como una tabla normal. Creo que Grails imprimirá algunos mensajes de registro sobre no poder hacer inserciones, eliminaciones, etc., pero no arrojará ningún error a menos que realmente intente hacer algo más que consultar con la clase de dominio.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top