当前位置: 首页 > article >正文

pgsql中处理数组类型字段

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 里面)


http://www.kler.cn/a/514282.html

相关文章:

  • 基于微信小程序的科创微应用平台设计与实现(LW+源码+讲解)
  • 基于Redis实现短信验证码登录
  • 【Linux】环境变量
  • 【Elasticsearch】 Ingest Pipeline `processors`属性详解
  • PHP语言的网络编程
  • 数据分析及应用:经营分析中的综合指标解析与应用
  • 【C++】运算符
  • PyTorch使用教程(5)-优化器
  • Android 绘图基础:Canvas,Paint,RectF,Paint类
  • 25/1/21 算法笔记<ROS2> 话题通信接口
  • LabVIEW太赫兹二维扫描成像系统
  • 【Nacos】Nacos快速上手
  • Models如何使用Gorm与数据库进行交互?
  • 利用Kubespray安装生产环境的k8s集群-准备篇
  • centos哪个版本建站好?centos最稳定好用的版本
  • 音频入门(二):音频数据增强
  • 【Elasticsearch】inference ingest pipeline
  • 缓存之美:万文详解 Caffeine 实现原理(上)
  • 多线程杂谈:惊群现象、CAS、安全的单例
  • 一文大白话讲清楚webpack基本使用——6——热更新及其原理
  • Bash语言的安全开发
  • 设计模式Python版 GOF设计模式
  • 【大厂面试题】软件测试面试题整理(附答案)
  • 消息队列篇--原理篇--RabbitMQ和Kafka对比分析
  • Git【将本地代码推送到远程仓库】--初学者必看
  • 2025美赛数学建模B题思路+模型+代码+论文