2010-04-01 7 views
5

Tengo una tabla con 11 columnas, pero necesito obtener solo 2 de ellas en mi aplicación, estoy usando la combinación de primavera/hibernación/DAO. Por ahora tengo una clase de dominio que incluye los 11 campos y un archivo de mapeo que mapea las 11 columnas en la tabla. ¿Cómo uso solo 2 de ellos, no todos?Obteniendo menos columnas con hibernación

Respuesta

10

O bien:

  1. Use proyecciones - Pro: nada que añadir - En contra: No Typesafe (el resultado es un List de filas, donde cada fila es un Object[]):

    select f.foo, f.bar from FatEntity f 
    
  2. Uso una expresión de constructor en la cláusula SELECT (la clase especificada no es necesaria para ser una entidad o para mapearse en la base de datos) - Pro: solución de tipo seguro - Con: Más clases, a menos que reutilice FatEntity como titular, en cuyo caso muchos campos serán null:

    select new com.acme.FatEntityDetails(f.id, f.foo, f.bar) from FatEntity f 
    

    Tenga en cuenta que si no se especifica un nombre de clase de entidad en la cláusula SELECT NEW, las instancias de entidades resultantes son en el nuevo estado (sin identidad persistente).

  3. Usa otra entidad mapeada en la misma tabla con solo los campos obligatorios - Pro: Es una entidad real que puedes modificar y actualizar - Con: Más clases.

    from LightEntity 
    

Las principales diferencias entre # 2 y # 3 son:

  • 2 no requiere el soporte de ser una entidad en absoluto.

  • el titular en el n. ° 2 podría ser una entidad mapeada en otra tabla.
  • si el n. ° 2 devuelve entidades, se encuentran en un estado nuevo (esto podría ser un problema o no).
+0

@Pascal Thivent ¿no puedo simplemente dejar 2 campos en mi clase de dominio y archivo de mapeo? –

+0

@Gandalf Bueno, pensé que alguien estaba usando los otros campos. Si esto no es cierto, entonces puedes cambiar tu entidad actual. –

+0

Gracias por las múltiples soluciones y explicaciones, ¿cómo se te ocurre eso? expirience? leyendo libros, entrenando? Aceptaré tu respuesta.si pudieras dirigirme en la dirección correcta sería genial, como: sitios web, ejemplos, libros. –

6

Probar:

SELECT myEntity.one, myEntity.two FROM MyEntity myEntity 

incluso se puede hacer:

SELECT new MyEntityDescription(myEntity.one, myEntity.two) FROM MyEntity myEntity 

para obtener una lista de las descripciones de la entidad.

2

Si nunca necesita más que esas 2 columnas de la tabla, puede cambiar su asignación de hibernación para asignar solo esas 2 columnas necesarias a la clase de entidad. Solo asigna las columnas de la tabla a las que deseas acceder en tu aplicación. Tenga en cuenta que las restricciones de la base de datos en las columnas "ignoradas" pueden violarse como restricciones no nulas, claves externas o restricciones exclusivas.

+0

¿qué pasa con la clase de dominio? ¿Necesito tener 2 campos allí también? –

Cuestiones relacionadas