使用列名获取Hibernate Entity字段

时间:2015-08-12 16:51:52

标签: java hibernate mapping

我一直在寻找这个问题,但我找不到合适的答案。

我试图根据列名从实体获取任何字段。

与泛型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;
   }
}

提前致谢。

2 个答案:

答案 0 :(得分:0)

据我所知,你做这件事的方式是唯一的方法。除了是,使用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;
       }

注意:您需要传入对象名称(aka:name,surname)而不是列名。

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

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

答案 1 :(得分:0)

当然,您可以使用反射遍历实体的字段,查找哪个具有相应名称的public static final int COL_NAME = 1; public static final int COL_SURNAME = 2; 注释。但是,很多人会告诉你反思很慢。

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

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);

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

SignInAsync

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