我的程序使用Metadata
类来描述不同对象的属性和字段:
class Metadata {
private String objectType;
private String table;
private String idAttribute;
private List<Attribute> attributes;
}
class Attribute {
private String name;
private List<Field> fields;
}
class Field {
private String name;
private String type;
private int size;
}
我们假设我得到了一个JSON:
{
"objectType": "OBJECT TYPE",
"table": "objects"
"idAttribute": "identifier";
"attributes": [
{
"name": "identifier",
"fields": [
{
"name": "id",
"type": "NUMERIC",
"size": 32
},
{
"name": "version"
"type": "NUMERIC",
"size": 8
}
]
},
// many other attributes
]
}
fields
表示来自我的数据库的table
中的实际列。我想使用MyBatis映射器检查指定version
和objectType
的对象的id
:
@Select(
"SELECT ${metadata.attributes.${metadata.idAttribute}.fields.(get the field name 'version' somehow) " +
"FROM ${metadata.table} " +
"WHERE ${metadata.attributes.${metadata.idAttribute}.fields.(get the field name 'id' somehow)}
= #{id} "
)
public byte getVersion(@Param("metadata") Metadata metadata),
@Param("id") long id);
如您所见,上面的查询看起来令人毛骨悚然,我不知道如何通过动态值提取具体字段。
是否有可能在MyBatis中执行此操作,或者除了获取java中的所有嵌套字段然后将它们传递给Mapper
之外没有别的办法?