Get column name in jpa
I have a query factory that takes a column n开发者_如何学Pythoname as an attribute in order to search for that column. Right now I'm passing the name of the column as a string, so it's kind of hardcoded. If the name of the column changes in the entity's annotation, that "hidden dependency" breaks up.
Is there a way in jpa to retrieve the real name of the column and have it available at compile time, so I can use it in queries?
Of course, there is always reflection on annotations. Suppose you have typical JPA column definition:
@Basic(optional = true)
@Column(name = "MY_COLUMN_NAME_DESC", nullable = true, length = 255)
public String getDesc() {
return desc;
}
Then having getter method inspected yields column name value (example adopted from 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());
}
}
The example assumes method property access in JPA entity but nothing prevents you to adopt it to field level by applying reflection to a field.
This is a bit late, I know. Topchef's answer is correct, but there are a couple of other factors that need to be considered if you want this to work for arbitrary entity classes. I'm adding them in case someone comes across this answer in a web search:
- The AttributeOverride class annotation can override the column specified with the Column annotation.
- If the inheritance strategy is JOINED, the column may reside in a different table even if a table is not specified with the Column annotation.
精彩评论