2010-05-27 28 views
6

Tengo una fábrica de consultas que toma el nombre de una columna como atributo para buscar esa columna. En este momento estoy pasando el nombre de la columna como una cadena, por lo que está algo codificado. Si el nombre de la columna cambia en la anotación de la entidad, esa "dependencia oculta" se rompe.Obtener el nombre de la columna en jpa

¿Existe alguna forma en jpa para recuperar el nombre real de la columna y tenerlo disponible en tiempo de compilación, para que pueda usarlo en las consultas?

Respuesta

6

Por supuesto, siempre hay reflexión sobre las anotaciones. Suponga que tiene típica definición de columna JPA:

@Basic(optional = true) 
    @Column(name = "MY_COLUMN_NAME_DESC", nullable = true, length = 255) 
    public String getDesc() { 
     return desc; 
    } 

luego tener rendimientos método getter inspeccionados valor del nombre de la columna (ejemplo adoptado de here):

Method method = ... //obtain entity object 
Annotation[] annotations = method.getDeclaredAnnotations(); 

for(Annotation annotation : annotations){ 
    if(annotation instanceof Column){ 
     Column myAnnotation = (Column) annotation; 
     System.out.println("name: " + myAnnotation.name()); 
     System.out.println("value: " + myAnnotation.value()); 
    } 
} 

el ejemplo se supone método property access en la entidad JPA, pero nada le impide para adoptarlo al nivel de campo mediante la aplicación de la reflexión a un campo.

+0

para los entusiastas, también puede comprobar esto Obtener Nombre de columna desde el establecimiento (http://stackoverflow.com/a/25520204/1225337) –

1

Esto es un poco tarde, lo sé. La respuesta de Topchef es correcta, pero hay otros factores que deben tenerse en cuenta si desea que esto funcione para clases de entidades arbitrarias. Los estoy añadiendo en caso de que alguien viene a través de esta respuesta en una búsqueda en Internet:

  • El AttributeOverride anotación clase puede anular la columna especificada con la anotación de la columna.
  • Si la estrategia de herencia está UNIDA, la columna puede residir en una tabla diferente incluso si no se especifica una tabla con la anotación de Columna.
+0

¿Hay API JPA para obtener la anotación de la columna para una propiedad? fusionando XML, AttributeOverride, @Column. Gracias. – eastwater

+0

@Dave: ninguna de la que tenga conocimiento, me temo, pero no he comprobado en el último año o tres. Necesitaba hacer esto en el pasado y también terminé fusionando las fuentes que mencionaste. Código muy desagradable y complejo para recrear algo que JPA debe hacer de todos modos. Tal vez pasar por Hibernate o EclipseLink proporciona directamente una forma ... –

+0

Parece que no proporcionan esa API pública. Internamente deben tener algo para fusionar configuraciones de fuentes de diferencia. – eastwater

Cuestiones relacionadas