我需要在Field
不知道其名称的情况下获取(或字段列表)。
即:对于自定义实体管理器,我希望能够像这样进行方法调用:
cem.getEntities(MyEntity.class, ParamMap)
其中 ParamMap 应该是 Type Map<Field, Object>
。
我现在能做的是这样的:
Map<Field, Object> params = new HashMap<Field, Object>();
params.put(MyEntity.class.getDeclaredField("someFieldName"), 20);
List<MyEntity> entitysWithSomeFieldNameEquals20 = cem.getEntities(MyEntity.class, params);
我试图避免使用查询,因为它首先应该“通用”,但也独立于字符串。(它们容易出错)。因此,实体管理器使用反射来确定他需要使用的表名和列名。
但是,我仍然需要使用
MyEntity.class.getDeclaredField("someFieldName")
这将简单地将容易出错的字符串“移出”实体管理器......
我想要实现的是这样的:
MyEntity.class.getDeclaredField(MyEntity.class.fields.someFieldName.toString())
因此,无论实际字段的名称是什么,都可以以保存方式引用它,并且重构也将重构所有字段访问调用。
我不确定这是否可能。我可以为所有实体使用(封装的)枚举,但我希望有一种更通用的方法来实现这一点。
编辑:
一个好的解决方案似乎是使用常量:
public class MyEntity{
private static string SOME_FIELD = "some_field_name_in_database";
@Column(name = SOME_FIELD);
private String someField;
}
...
Map<String, Object> params = new HashMap<String, Object>();
params.put(MyEntity.SOME_FIELD, matchValue);
List<MyEntity> result = eem.getEntities(MyEntity.class, params);
这至少将字符串的使用减少到一个位置,可以在该位置对其进行维护和更改,而不会影响任何其他文件。但我仍在寻找没有常量的解决方案,因此不需要与可用字段同步:-)