我一直在寻找这个问题,但我找不到合适的答案。
我试图根据列名从实体获取任何字段。
与泛型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;
}
}
提前致谢。
答案 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的注释处理来生成相同的代码。