我有一个查询工厂,它将列名作为属性来搜索该列。现在我将该列的名称作为字符串传递,因此它是一种硬编码。如果列的名称在实体的注释中发生变化,那么“隐藏的依赖关系”会分解。在jpa中获取列名称
有没有办法在jpa中检索列的真实姓名并在编译时提供它,所以我可以在查询中使用它?
我有一个查询工厂,它将列名作为属性来搜索该列。现在我将该列的名称作为字符串传递,因此它是一种硬编码。如果列的名称在实体的注释中发生变化,那么“隐藏的依赖关系”会分解。在jpa中获取列名称
有没有办法在jpa中检索列的真实姓名并在编译时提供它,所以我可以在查询中使用它?
当然,总会有对注释的反思。假设有典型JPA列定义:
@Basic(optional = true)
@Column(name = "MY_COLUMN_NAME_DESC", nullable = true, length = 255)
public String getDesc() {
return desc;
}
然后具有吸气剂的方法检测产率列名的值(例如,从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());
}
}
该示例假定方法property access在JPA实体,但没有什么能够阻止你通过对领域进行反思来将其应用于现场级别。
这是有点晚了,我知道。 Topchef的回答是正确的,但是如果你想让它适用于任意实体类,还有其他一些因素需要考虑。我将它们添加以防万一在网络搜索中遇到此问题:
是否有JPA API获取属性的列注释?合并XML,AttributeOverride,@Column。谢谢。 – eastwater 2015-05-19 14:26:24
@Dave:我没有意识到我害怕,但我在去年或三年没有检查过。我需要在过去做这件事,并且合并你提到的来源。非常讨厌,复杂的代码来重新创建JPA必须做的事情。也许通过Hibernate或EclipseLink直接提供了一种方法... – 2015-05-19 18:32:42
看来他们不提供这样的公共API。在内部,他们必须有东西来合并来自不同来源的配置。 – eastwater 2015-05-22 15:15:40
对于爱好者,也可以查看此属性获取列名称(http://stackoverflow.com/a/25520204/1225337) – 2014-08-27 06:30:43