【问题标题】:get Hibernate Entity field with column name获取具有列名的休眠实体字段
【发布时间】:2015-08-13 06:15:26
【问题描述】:

我一直在寻找这个,但我找不到正确的答案。

我正在尝试根据实体的列名从实体中获取任何字段。

就像一个通用的 get,它接收一个 String columnName 并返回一个 Object field,它表示 Hibernate 由该 columnName 映射的 Class 字段。

例如

    @Table(name="ENTITY_EXAMPLE")
    public class EntityExample{

       @Column(name="COL_NAME")
       private String name;

       @Column(name="COL_SURNAME")
       private String surname;

       public EntityExample(String name, String surname){
          this.name=name;
          this.surname=surname;
       }

        //getters and setters

       public Object getField(String columnName){

          Object field=//some way to map the columnName with the field;
          return field;
       }
}

public main(String[] args){

   EntityExample example=new EntityExample("John", "Doe");

   String exampleName=(String) example.getField("COL_NAME");
   String exampleSurname=(String) example.getField("COL_SURNAME");

  System.out.println("NAME: "+ exampleName+ ", SURNAME: "+exampleSurname);
}

并且应该在运行时打印主要内容:

NAME: John, SURNAME: Doe

我现在正在做的方式是使用 ifs 检查参数是否等于每个带注释的列,如果相等则在内部返回字段,但它应该是一种正确的方法。

我现在的做法:

public Object getField(String columnName){

   if(columnName.equals("COL_NAME")){
    return name;
   }
   if(columnName.equals("COL_SURNAME")){
    return surname;
   }
}

提前致谢。

【问题讨论】:

    标签: java hibernate mapping


    【解决方案1】:

    据我所知,您的做法是唯一的方法。除了使用 switch 语句而不是多个 if 语句之外:

    switch (columnName) {
                case 1:  columnName = "COL_NAME";
                         return this.name;
                         break;
                case 2:  columnName= "COL_SURNAME";
                         return this.surname;
                         break;
                default: columnName= "COL_BLAHBLAH";
                         return this.blahblhblah;
                         break;
            }
    

    实现您想要的唯一可能的方法(这是一个很大的延伸),如果您按照以下方式做了一些事情:

    public Object getField(String columnName){
    
              Object field= (Object)columnName; 
              return field;
           }
    

    注意:您需要传入对象名称(又名:姓名、姓氏)而不是列名。

    但老实说,我认为这行不通。无论如何,您需要以编译器知道如何正确处理转换的方式将字符串转换为对象(不认为这是可能的)。

    祝你好运。也许其他人会有更多的想法。

    【讨论】:

    • 好的,谢谢。在出现答案之前,我会继续这样做,我认为这可能是一个更好的方法。谢谢你的回答
    【解决方案2】:

    当然,您可以使用反射来遍历实体的字段,查找具有相应名称的@Column 注释的字段。但是,很多人会告诉你,Reflection 很慢。

    为此,我们为每一列创建了一组公共静态整数常量。因此,在您的实体中,您将拥有以下内容:

    public static final int COL_NAME = 1;
    public static final int COL_SURNAME = 2;
    

    在 Entity 中你也有一个getFieldValue 方法,如下所示:

    public Object getFieldValue(int fieldNo) {
        switch (fieldNo) {
            case COL_NAME:
                return this.name;
            case COL_SURNAME:
                return this.surname;
            default:
                throw IllegalArgumentException("Invalid Field Number: " + fieldNo);
        }
    }
    

    您将使用这些来获取字段值,如下所示:

    String name = entityExample.getFieldValue(EntityExample.COL_NAME);
    

    当然,您现在遇到的问题是在添加/删除/重命名列时维护常量列表和切换案例。我们通过使用脚本来生成常量和方法来解决这个问题。您也可以使用 Java 的注解处理来生成相同的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-24
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2012-08-21
      相关资源
      最近更新 更多