代码之家  ›  专栏  ›  技术社区  ›  German

在JPA中获取列名称

jpa
  •  6
  • German  · 技术社区  · 14 年前

    我有一个查询工厂,它将列名称作为属性来搜索该列。现在我将列的名称作为字符串传递,所以它有点硬编码。如果该列的名称在实体的注释中发生更改,则该“隐藏依赖项”将中断。

    JPA中是否有一种方法来检索列的真实名称,并在编译时使其可用,这样我就可以在查询中使用它?

    2 回复  |  直到 11 年前
        1
  •  6
  •   Community datashaman    7 年前

    当然,注释总是有反映的。假设您有典型的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());
        }
    }
    

    示例假设方法 property access 在JPA实体中,但是没有什么可以阻止您通过将反射应用到字段来将其应用到字段级别。

        2
  •  1
  •   Alvin Thompson    11 年前

    我知道,现在有点晚了。TopChef的回答是正确的,但是如果您希望它适用于任意实体类,还需要考虑其他一些因素。我正在添加它们,以防有人在Web搜索中遇到此答案:

    • attributeOverride类批注可以覆盖列批注指定的列。
    • 如果继承策略已联接,则列可能驻留在其他表中,即使没有使用列注释指定表。