sql database grails view

Vistas de SQL/base de datos en Grails



database view (3)

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 intente hacer algo más que consultar con la clase de dominio.

¿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 contra 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 a qué clase de dominio ejecutar executeQuery, ya que realmente solo estamos usando esa clase de dominio para ejecutar la consulta contra una entidad completamente no relacionada (la vista).

¿Sería preferible crear una clase de dominio que representara la vista y entonces podríamos simplemente 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 Class sin campo ID o con campo compuesto parcialmente NULL


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

Por ejemplo en tu 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 sea autoexplicativa. La documentación se puede encontrar aquí


Puedes poner esto en las asignaciones de clases de tu dominio:

static mapping = { cache ''read-only'' }

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

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

Sin embargo, una cosa de la que debes tener cuidado es el procesamiento por lotes de consultas de Hibernate (y todo el negocio de limpieza). 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 en realidad no habrá insertado las filas todavía, mientras que si seleccionó la tabla en la que insertó las filas, Hibernate se habrá dado cuenta de que necesitaba eliminar las 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 necesitará leer a través de una vista posterior en la misma transacción.

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