Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取具有列名的Hibernate实体字段_Java_Hibernate_Mapping - Fatal编程技术网

Java 获取具有列名的Hibernate实体字段

Java 获取具有列名的Hibernate实体字段,java,hibernate,mapping,Java,Hibernate,Mapping,我四处寻找这个问题,但找不到正确的答案 我试图根据实体的列名从实体中获取任何字段 与通用get类似,它在get中接收一个字符串columnName,并返回一个对象字段,该字段表示Hibernate通过该columnName映射的类字段 比如说 @Table(name="ENTITY_EXAMPLE") public class EntityExample{ @Column(name="COL_NAME") private String name;

我四处寻找这个问题,但找不到正确的答案

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

与通用get类似,它在get中接收一个
字符串columnName
,并返回一个
对象字段
,该字段表示Hibernate通过该columnName映射的类字段

比如说

    @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;
   }
}

提前谢谢。

据我所知,你这样做是唯一的办法。例外情况是,要使用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,姓氏),而不是列名

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


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

据我所知,你这样做是唯一的办法。例外情况是,要使用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,姓氏),而不是列名

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


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

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

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

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);
您可以使用这些字段获取如下值:

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的注释处理来生成相同的代码。

当然,您可以使用反射来遍历实体的字段,查找哪个字段具有带有相应名称的
@列
注释。然而,许多人会告诉你,反射是缓慢的

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

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);
您可以使用这些字段获取如下值:

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的注释处理来生成相同的代码。

好的,谢谢。我会一直这样做,直到找到答案,我想这可能是一个更好的方法。谢谢你的回答好的,谢谢。我会一直这样做,直到找到答案,我想这可能是一个更好的方法。谢谢你的回答