Java 获取具有列名的Hibernate实体字段
我四处寻找这个问题,但找不到正确的答案 我试图根据实体的列名从实体中获取任何字段 与通用get类似,它在get中接收一个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;
字符串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的注释处理来生成相同的代码。好的,谢谢。我会一直这样做,直到找到答案,我想这可能是一个更好的方法。谢谢你的回答好的,谢谢。我会一直这样做,直到找到答案,我想这可能是一个更好的方法。谢谢你的回答