DBJava프로그래밍

[PostgreSQL, JAVA] ARRAY_AGG(ad_cnt) 결과를 Java(Spring Boot, JPA, MyBatis 모두 포함)에서 어떻게 받아서 처리하는지 예제 포함

다음 내용은 ARRAY_AGG(ad_cnt) 결과를 Java(Spring Boot, JPA, MyBatis 모두 포함)에서 어떻게 받는지 상황별로 정확하게 정리한 내용이다.

해줄게.


1) JPA + Hibernate (Entity or DTO)

① DTO로 받기 (가장 깔끔함)

🔹 SQL 결과 예:

ad_cnt_list = {1, 5, 9} (PostgreSQL 배열)

🔹 DTO

public class Tb1AdCntDto {
    private Long id;
    private List<Integer> adCntList;
}

🔹 Repository (Native Query)

@Query(value = """
    SELECT 
        t1.id,
        ARRAY_AGG(t2.ad_cnt) AS ad_cnt_list
    FROM tb1 t1
    LEFT JOIN tb2 t2 ON t2.tb1_id = t1.id
    GROUP BY t1.id
""", nativeQuery = true)
List<Object[]> findAdCntNative();

🔹 서비스에서 변환

List<Tb1AdCntDto> result = repository.findAdCntNative().stream()
    .map(row -> {
        Long id = ((Number) row[0]).longValue();

        // PostgreSQL 배열 → Java List
        Integer[] arr = (Integer[]) row[1];
        List<Integer> adCntList = Arrays.asList(arr);

        return new Tb1AdCntDto(id, adCntList);
    })
    .toList();

2) Spring JDBC Template

String sql = """
    SELECT 
        t1.id,
        ARRAY_AGG(t2.ad_cnt) AS ad_cnt_list
    FROM tb1 t1
    LEFT JOIN tb2 t2 ON t2.tb1_id = t1.id
    GROUP BY t1.id
""";

List<Tb1AdCntDto> result = jdbcTemplate.query(sql, (rs, rowNum) -> {

    Long id = rs.getLong("id");

    // PostgreSQL array → Java array
    Integer[] arr = (Integer[]) rs.getArray("ad_cnt_list").getArray();

    return new Tb1AdCntDto(id, Arrays.asList(arr));
});

✔ PostgreSQL 배열은 java.sql.Array로 들어오며, .getArray() 하면 Java 배열이 됨.


3) MyBatis 사용 시

🔹 Mapper XML

<select id="selectAdCntList" resultMap="Tb1AdCntMap">
    SELECT 
        t1.id,
        ARRAY_AGG(t2.ad_cnt) AS ad_cnt_list
    FROM tb1 t1
    LEFT JOIN tb2 t2 ON t2.tb1_id = t1.id
    GROUP BY t1.id
</select>

🔹 resultMap 정의

<resultMap id="Tb1AdCntMap" type="com.example.Tb1AdCntDto">
    <result property="id" column="id"/>
    <result property="adCntList" column="ad_cnt_list" 
        javaType="java.util.List"
        typeHandler="org.apache.ibatis.type.ArrayTypeHandler"/>
</resultMap>

🔹 DTO

private List<Integer> adCntList;

MyBatis는 PostgreSQL ARRAY를 자동으로 List로 변환해줌.


4) R2DBC (리액티브) 사용 시

PostgreSQL ARRAY 자체가 Integer[]로 들어오기 때문에 List로 변환만 하면 됨.

client.sql("""
    SELECT 
        t1.id,
        ARRAY_AGG(t2.ad_cnt) AS ad_cnt_list
    FROM tb1 t1
    LEFT JOIN tb2 t2 ON t2.tb1_id = t1.id
    GROUP BY t1.id
""")
    .map(row -> {
        Long id = row.get("id", Long.class);
        Integer[] arr = row.get("ad_cnt_list", Integer[].class);
        return new Tb1AdCntDto(id, List.of(arr));
    })
    .all();



핵심 정리

기술PostgreSQL ARRAY_AGG 받는 방법
JPAObject[] → Integer[] 캐스팅 후 List로 변환
JDBC Templaters.getArray() → Integer[] 변환
MyBatisArrayTypeHandler 자동 변환
R2DBCrow.get(“ad_cnt_list”, Integer[].class)

Hi, I’m 똘켓