Trino中CAST AS ROW字段名大小写不敏感映射问题求助
问题描述
我使用以下Trino SQL语句查询数据:
select cast (cast("cf00a399af"."2be9fc3823" as json) as row(cityId bigint, city varchar)) as address, count(0) as num from ygg_dev."913852142333198336" cf00a399af group by "cf00a399af"."2be9fc3823"
查询结果如下:
| address | num |
|---|---|
| {cityid=44, city=石家庄市} | 1 |
| {cityid=23, city=天津市} | 1 |
| {cityid=1318, city=泉州市} | 1 |
| {cityid=0, city=} | 9 |
| {cityid=1274, city=福州市} | 1 |
| {cityid=1318, city=泉州市} | 1 |
| {cityid=2, city=北京市} | 1 |
| {cityid=1318, city=泉州市} | 2 |
结果中的字段为小写的cityid,但我需要实现大小写不敏感匹配,使其对应Java实体类中的cityId属性,该如何处理?
对应的Java实体类:
@Data public class AddressInputValue implements java.io.Serializable{ private static final long serialVersionUID = 1L; @ApiModelProperty("省ID") private long provinceId; @ApiModelProperty("省名称") private String province; @ApiModelProperty("市ID") private long cityId; @ApiModelProperty("市名称") private String city; @ApiModelProperty("县ID") private long countyId; @ApiModelProperty("县名称") private String county; @ApiModelProperty("详细地址") private String address; @ApiModelProperty("经纬度坐标") private MapPoint point; }
解决方法
方案1:修改SQL,显式匹配字段名
拆分JSON字段提取逻辑,直接指定与Java属性一致的字段别名:
select row( cast(json_extract_scalar("cf00a399af"."2be9fc3823", '$.cityid') as bigint) as cityId, json_extract_scalar("cf00a399af"."2be9fc3823", '$.city') as city ) as address, count(0) as num from ygg_dev."913852142333198336" cf00a399af group by "cf00a399af"."2be9fc3823"
这样查询结果中address结构体的字段就是cityId,与Java实体类属性完全匹配。
方案2:Java全局配置大小写不敏感映射
如果使用Jackson作为JSON处理框架,可开启全局大小写不敏感匹配:
ObjectMapper objectMapper = new ObjectMapper(); objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
Spring Boot项目可直接在配置文件中全局配置:
spring.jackson.mapper.accept-case-insensitive-properties=true
配置后框架会自动忽略字段名大小写,将cityid映射到cityId属性。
方案3:字段级注解指定映射
在cityId字段上添加@JsonProperty注解,明确指定匹配的小写字段名:
@ApiModelProperty("市ID") @JsonProperty("cityid") private long cityId;
该方式仅针对单个字段生效,映射关系更精准。
内容的提问来源于stack exchange,提问作者dapisces
相关产品推荐
相关产品推荐

