query - gorm outside grails
Grails Domain Class sin campo ID o con campo compuesto parcialmente NULL (2)
Según una respuesta a una pregunta anterior (respuesta aquí: SQL / Vistas de base de datos en Grails ), he tratado de usar una clase de dominio para representar una vista en mi base de datos. Sin embargo, esto funciona maravillosamente en la mayoría de los casos:
Tengo una vista sin una sola clave única. Digamos que las tablas subyacentes se ven así:
UN:
id, varX
1, "Blah"
2, "Foo"
3, "Bar"
SEGUNDO:
id, A.id, C.id
1,2,1
2,2,2
3,3,1
DO:
id, varY
1, "Boom"
2, "Fizzle"
Mi vista se ve así:
A.id, varX, B.id, C.id, varY
1, "Blah", NULL, NULL, NULL
2, "Foo", 1,1, "Boom"
2, "Foo", 2,2, "Fizzle"
3, "Bar", 3,1, "Boom"
Así es exactamente como debe buscar nuestros propósitos. Sin embargo, como puede ver, la mejor ID compuesta única que podríamos construir para la vista es [''A.id'', ''C.id''], ya que identifica de forma única cada elemento, pero Grails falla porque parece que no puede tratar con parte de una identificación compuesta es NULL (en realidad, list () devuelve una lista de 4 objetos, la primera es un puntero nulo, el resto son instancias de dominio reales de la vista).
Tenga en cuenta que también podríamos usar A.id y B.id, pero sufre el mismo problema.
Tenga en cuenta también que QUEREMOS mostrar elementos de la tabla A al menos una vez (con valores nulos para cualquier campo que no se encuentre en las tablas B / C), posiblemente muchas veces si hay múltiples entradas correspondientes en la tabla B.
Entonces, mi pregunta es 2 partes:
1: ¿Es posible definir una clase de dominio Grails sin ningún campo ID en absoluto? No necesitamos un control permanente para ninguna de las entradas de vistas, solo necesitamos listar los datos en esa vista.
2: Si no es así, ¿es posible definir una clase de dominio Grails con un campo ID compuesto, parte del cual puede ser NULO, pero que identificará de manera única una fila de todos modos incluso si parte de la ID compuesta es NULA?
Sé que podemos usar Groovy SQL directamente para consultar la vista directamente sin una clase de dominio asociada (estamos haciendo esto ahora en realidad), pero idealmente nos gustaría representar la vista con una clase de dominio. Además, dejando de lado todos los argumentos, estas dos preguntas pueden aplicarse de manera mucho más genérica que solo a nuestro problema particular.
¿Has probado lo que la sección de Ids compuestos menciona en esta página de referencia ? No he intentado usarlo yo mismo y no estoy seguro de si esto ha cambiado en la última versión.
Además, si observa la Tabla B, los únicos valores para A.id son 2 y 3, ¿no cree que cuando A.id es 1 el resultado sería nulo para B.id, C.id y varY? ¿o solo fue eso como un ejemplo?
Tuvimos ese problema antes.
Según mi experiencia, las ID compuestas simplemente no están bien respaldadas en Grails o quizás en Hibernate.
Siempre encontramos una manera de tener una identificación única para todas nuestras clases de dominio.
Para las tablas reales, simplemente agregamos un campo de incremento automático, aunque si no estuviéramos usando griales, habríamos usado una clave compuesta.
Para las vistas de la base de datos, generalmente tenemos una ID ya en una de las tablas unidas que termina siendo única en ese contexto, pero si no lo hacemos, hay formas de hackear / simular esto. Por ejemplo, en SQL, simplemente concatene las claves que usaría en su clave compuesta como un solo campo y úsela como la clave.