# 函数列

通常情况下实体类中的属性为对应表字段的一个映射,这是一一照应的。如果想在实体中属性映射一个函数进行数据获取,则可以使用函数列声明@FuncColumn及@FuncColumns

# 注解说明

@FuncColumns可以声明多个@FuncColumn,每个@FuncColumn可以设置属性forDb进行指定这个函数表达式所应用的数据库,这样兼容多种数据库函数达到目标一致的查询。

默认情况下forDb=DbEnum.ANY,表示适合所有数据库。

public class Student {

	@SnowflakeId
	private Long id;
	
	@AttributeOptions(typeHandler = JsonTypeHandler.class)
	private Map<String, Object> parents;

	@FuncColumn(expression = "${parents} ->> '$.fatherName'") // 提取JSON字段值
	private String fatherName;
	
	@Transient
	private Map<String, Object> params;
	
	public Map<String, Object> getParams() {
		return params == null ? (params = new HashMap<>()) : params;
	}
}

表达式中可以使用${}引用实体的属性,或直接是表列名,框架会优化查当前实体中有没同名属性,如果有则映射属性的表列名,否则认为就是列名。

即使是直接使用表字段名,也建议使用${}引起来,因为多表关联查询时,引起来的字段/属性会自动添加上表的别名,避免发生字段名冲突的可能性。