我有一个查询工厂,它将列名作为属性以搜索该列。现在我将列的名称作为字符串传递,因此它是硬编码的。如果列的名称在实体的注释中发生更改,则“隐藏的依赖关系”会中断。
在jpa中有没有办法检索列的真实名称并在编译时使用它,所以我可以在查询中使用它?
答案 0 :(得分:6)
当然,注释总会有反思。假设您有典型的JPA列定义:
@Basic(optional = true)
@Column(name = "MY_COLUMN_NAME_DESC", nullable = true, length = 255)
public String getDesc() {
return desc;
}
然后检查getter方法会产生列名值(从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());
}
}
该示例假定JPA实体中的方法property access,但没有任何内容阻止您通过将反射应用于字段来将其采用到字段级别。
答案 1 :(得分:1)
我知道这有点晚了。 Topchef的答案是正确的,但是如果你想让它适用于任意实体类,还有一些其他因素需要考虑。我正在添加它们以防万一有人在网络搜索中遇到这个答案: