2010-05-27 110 views
6

我有一个查询工厂,它将列名作为属性来搜索该列。现在我将该列的名称作为字符串传递,因此它是一种硬编码。如果列的名称在实体的注释中发生变化,那么“隐藏的依赖关系”会分解。在jpa中获取列名称

有没有办法在jpa中检索列的真实姓名并在编译时提供它,所以我可以在查询中使用它?

回答

6

当然,总会有对注释的反思。假设有典型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实体,但没有什么能够阻止你通过对领域进行反思来将其应用于现场级别。

+0

对于爱好者,也可以查看此属性获取列名称(http://stackoverflow.com/a/25520204/1225337) – 2014-08-27 06:30:43

1

这是有点晚了,我知道。 Topchef的回答是正确的,但是如果你想让它适用于任意实体类,还有其他一些因素需要考虑。我将它们添加以防万一在网络搜索中遇到此问题:

  • AttributeOverride类注释可以覆盖使用Column注释指定的列。
  • 如果继承策略是JOINED,则即使未使用Column注释指定表,该列也可能驻留在不同的表中。
+0

是否有JPA API获取属性的列注释?合并XML,AttributeOverride,@Column。谢谢。 – eastwater 2015-05-19 14:26:24

+0

@Dave:我没有意识到我害怕,但我在去年或三年没有检查过。我需要在过去做这件事,并且合并你提到的来源。非常讨厌,复杂的代码来重新创建JPA必须做的事情。也许通过Hibernate或EclipseLink直接提供了一种方法... – 2015-05-19 18:32:42

+0

看来他们不提供这样的公共API。在内部,他们必须有东西来合并来自不同来源的配置。 – eastwater 2015-05-22 15:15:40