postgresSQL查询返回 integer[] 在Java中的接收

10 篇文章 0 订阅
3 篇文章 0 订阅

postgresSQL查询返回 integer[] 在Java中的接收

ContactsVo.java

inchargeId字段需要接收一个id数组,一直接收不到,估计是sql类型和jdbctype没有对应上,所以尝试用typehandler来解决。

image-20230203152921673

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;

import java.sql.Array;
import java.util.Date;
import java.util.List;

@ApiModel
@Getter
@Setter
public class ContactsVo {
    
    @ApiModelProperty("联系人id")
    private Integer id;
    
    @ApiModelProperty("客户id")
    private Integer customerId;
    
    @ApiModelProperty("单位名称")
    private String enterpriseName;
    
    @ApiModelProperty("公司负责人id")
    private Integer[] inchargeId;
    
    @ApiModelProperty("公司负责人姓名")
    private String inchargeName;
    
    @ApiModelProperty("性别 1-男 2-女 3-保密")
    private Integer sex;

    @ApiModelProperty("年龄")
    private String age;
}
ArrayTypeHandler

用作SQL中varchar,integer,boolean, numeric 与 Java中的String,Integer,Boolean,Double之间的类型转换,不然Java接收不到各类型的数组。

package com.popsmart.oa.dao.handler;

import org.apache.ibatis.type.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.sql.*;

@MappedTypes(value = Object.class)
@MappedJdbcTypes(value = {JdbcType.ARRAY})
public class ArrayTypeHandler extends BaseTypeHandler<Object[]> {
    private static final Logger LOGGER = LoggerFactory.getLogger(ArrayTypeHandler.class);

    private static final String TYPE_NAME_VARCHAR = "varchar";
    private static final String TYPE_NAME_INTEGER = "integer";
    private static final String TYPE_NAME_BOOLEAN = "boolean";
    private static final String TYPE_NAME_NUMERIC = "numeric";

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Object[] parameter, JdbcType jdbcType)
            throws SQLException {
        String typename = null;
        if (parameter instanceof Integer[]) {
            typename = TYPE_NAME_INTEGER;
        } else if (parameter instanceof String[]) {
            typename = TYPE_NAME_VARCHAR;
        } else if (parameter instanceof Boolean[]) {
            typename = TYPE_NAME_BOOLEAN;
        } else if (parameter instanceof Double[]) {
            typename = TYPE_NAME_NUMERIC;
        }

        if (typename == null) {
            throw new TypeException("ArrayTypeHandler parameter typename error, your type is " + parameter.getClass().getName());
        }

        //这2行是关键的代码,创建array,然后ps.setarray(i, array)就可以了
        Array array = ps.getConnection().createArrayOf(typename, parameter);
        ps.setArray(i, array);
    }

    @Override
    public Object[] getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return getArray(rs.getArray(columnName));
    }


    @Override
    public Object[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return getArray(rs.getArray(columnIndex));
    }


    @Override
    public Object[] getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return getArray(cs.getArray(columnIndex));
    }

    private Object[] getArray(Array array) {

        if (array == null) {
            return null;
        }

        try {
            return (Object[]) array.getArray();
        } catch (SQLException e) {
            LOGGER.error("ArrayTypeHandler getArray SQLException",e);
        }
        return null;

    }
}
ContactsMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.popsmart.oa.dao.ContactsMapper">
    <resultMap id="contactsVoList" type="com.popsmart.oa.domain.vo.ContactsVo">
        <result column="id" property="id"/>
        <result column="customer_id" property="customerId"/>
        <result column="enterprise_name" property="enterpriseName"/>
        <result column="incharge_id" property="inchargeId" typeHandler="com.popsmart.oa.dao.handler.ArrayTypeHandler"/>
        <result column="incharge_name" property="inchargeName"/>
        <result column="sex" property="sex"/>
        <result column="age" property="age"/>
    </resultMap>
    <select id="findList" resultMap="contactsVoList">
        select c.*, e.name as enterprise_name, c1.incharge_id, c1.incharge_name,SUBSTRING(age(current_date,c.birthday)::varchar,1,2) age
        from (select id,
        customer_id,
        sex
        from contacts
        where true
        <if test="name != null">
            and name like '%' || #{name} || '%'
        </if>
        <if test="phone != null">
            and phone != #{phone}
        </if>
        <if test="customerId != null">
            and customer_id = #{customerId}
        </if>
        ) c
        left join customer c2 on c.customer_id = c2.id
        left join enterprise e on c2.enterprise_id = e.id
        left join (select cur.contacts_id, array_agg(u.id) as incharge_id, 
        	array_to_string(ARRAY(SELECT unnest(array_agg(u.name))), ',') as incharge_name
            from contacts_user_rel cur
            left join "user" u on cur.incharge_id = u.id
            group by cur.contacts_id
        ) c1 on c1.contacts_id = c.id
        where true
        <if test="inchargeId != null">
            and #{inchargeId} = any (incharge_id)
        </if>
    </select>
</mapper>

这里指定一下typeHandler就可以了

image-20230203152724001
接收到了:
image-20230203153045865

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 PostgreSQL 进行分页查询,可以使用 `LIMIT` 和 `OFFSET` 子句来实现。以下是一个示例的 PostgreSQL 分页查询语句: ```sql SELECT * FROM TableName ORDER BY ColumnName LIMIT @PageSize OFFSET (@PageIndex - 1) * @PageSize; ``` 在这个示例,你需要将 `TableName` 替换为你要查询的表名,`ColumnName` 替换为你要排序的列名,`@PageIndex` 替换为当前页的索引,`@PageSize` 替换为每页的记录数。 通过 `LIMIT` 子句可以设置要返回的行数,这里使用 `@PageSize` 来指定每页的记录数。然后,通过 `OFFSET` 子句可以设置要跳过的行数,这里使用 `(@PageIndex - 1) * @PageSize` 来计算跳过的行数。 请注意,在使用 `LIMIT OFFSET` 子句进行分页查询之前,最好先进行排序(使用 `ORDER BY` 子句),以确保结果的顺序正确。 另外,如果你需要获取分页查询的总记录数,你可以使用子查询或 CTE(Common Table Expression)来实现。以下是一个示例的 PostgreSQL 分页查询语句,同时返回总记录数: ```sql WITH CTE AS ( SELECT *, COUNT(*) OVER() AS TotalCount FROM TableName ORDER BY ColumnName LIMIT @PageSize OFFSET (@PageIndex - 1) * @PageSize ) SELECT * FROM CTE; ``` 使用了 CTE 来计算总记录数,并将其作为额外的列 `TotalCount` 添加到查询结果。 请注意,以上示例的参数 `@PageIndex` 和 `@PageSize` 是占位符,你需要根据实际情况将它们替换为具体的值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值