[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 받는 방법 |
|---|---|
| JPA | Object[] → Integer[] 캐스팅 후 List로 변환 |
| JDBC Template | rs.getArray() → Integer[] 변환 |
| MyBatis | ArrayTypeHandler 자동 변환 |
| R2DBC | row.get(“ad_cnt_list”, Integer[].class) |


