1、代码中存入和读取
需要使用自定义转换器
@Slf4j
public class ArrayTypeHandler extends BaseTypeHandler<List<String>> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType)
throws SQLException {
Object[] objects = parameter.toArray();
Array array = ps.getConnection().createArrayOf("varchar", objects);
ps.setArray(i, array);
}
@Override
public List<String> getNullableResult(ResultSet rs, String columnName) throws SQLException {
return getArray(rs.getArray(columnName));
}
@Override
public List<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return getArray(rs.getArray(columnIndex));
}
@Override
public List<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return getArray(cs.getArray(columnIndex));
}
private List<String> getArray(Array array) {
if (array == null) {
return null;
}
try {
String[] objects = (String[]) array.getArray();
return Arrays.asList(objects);
} catch (SQLException e) {
log.error("sql转换失败");
}
return null;
}
}
本项目使用的ORM框架是mybatis-flex 在字段上添加注解
@Column(jdbcType = JdbcType.ARRAY,typeHandler = ArrayTypeHandler.class)
private List<String> swlToCnIds;
然后正常插入、查询即可
2、sql中使用数组属性字段
- 使用any函数
// 是否包含
value = ANY(array)
// 是否有大于值
value > ANY(array)
// 小于同理
value < ANY(array)
// 是否有不等于的
value <> ANY(array)
any和关联查询一起使用
SELECT
b.*,string_agg(DISTINCT s1.name, ',' order by s1.name) as sw_to_bts,string_agg(DISTINCT s2.name,',' order by s2.name) as sw_to_cn
FROM
t_ne_mgr_bsc b
LEFT JOIN
t_ne_switch_mgr s1 ON s1.id = ANY(b.swl_to_bts_ids)
LEFT JOIN
t_ne_switch_mgr s2 ON s2.id = ANY(b.swl_to_cn_ids)
WHERE
b.removed = false
group by b.id
关联查询的结果用函数string_agg聚合 拼接成为一个新字段
(因为id是主键,因此其它列不用写在group by 里面)