Hibernate는 기본적으로 PostgreSQL의 Array 데이터 타입을 지원해 주지 않는다.
vladmihalcea 라이브러리를 추가
implementation("com.vladmihalcea:hibernate-types-60:2.20.0")
type-60은 하이버네이트 6.0 이상부터 지원하는 라이브러리다. 각자 상황의 맞는 버전을 추가하면 된다.
스키마
create table job_offer
(
job_offer_id bigserial primary key,
days varchar(50)[] not null,
);
엔티티
@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class JobOffer extends BaseTime {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long jobOfferId;
@Type(value = ListArrayType.class,
parameters = @Parameter(name = AbstractArrayType.SQL_ARRAY_TYPE,
value = "varchar"))
private List<Day> days;
}
여러 타입들을 지원해주는데 기본적으로 배열을 위주로 지원해주고 있다. 예를 들어 StringArrayType.class 는 자바 String[]을 지원해주는 타입이다.
나는 List로 관리하고 싶었기에 ListArrayType.class를 사용했다. 여러 테스트 결과 List에 무엇을 담아도 ListArrayType을 사용하면 잘 작동되었다. Day는 Enum 클래스이다. 특별히 @Enumerate(String)을 사용하지 않아도 String으로 저장하고 변환해 준다.
@Parameter 의 name은 "sql_array_type"을 사용해도 되고 위에처럼 상수를 사용해도 된다.
value 에는 데이터베이스에 어떤 데이터 타입이 배열로 들어가게 되는지 넣어주면 된다.
주의
QueryDSL 을 사용해서 조회할 때 일반적인 일대다 관계처럼 생각하고 코드를 짜다 보면 실행이 안되는 경우가 많다.
예를 들어 랜덤으로 하나만 가져오거나 그러기는 힘들고 배열 전체를 가져와서 하나를 꺼내는 식으로 해야된다.
728x90
'JVM > JPA' 카테고리의 다른 글
2차 캐시 (0) | 2023.07.05 |
---|---|
낙관적 락과 비관적 락 (0) | 2023.07.05 |
트랜잭션을 지원하는 쓰기 지연 (0) | 2023.07.04 |
SQL 쿼리 힌트 사용 (0) | 2023.07.04 |
읽기 전용 쿼리의 성능 최적화 (0) | 2023.07.04 |