본문 바로가기
학습/DB

@Query 활용하기 1

by 코동이 2021. 9. 26.

*JPA에서 칼럼명을 이용해서 조회하기

 

List<Book> findByCategoryIsNullAndNameEqualsAnd
CreatedAtGreaterThanEqualAndUpdatedAtGreaterThanEqual
(String name, LocalDateTime createdAt, LocalDateTime updatedAt)

 

findByCategory : 칼럼 Category가 null이다.

NameEquals :  매개변수 name과 같다.

CreatedAtGreaterThanEqual : CreatedAt이 매개변수 createdAt과 같거나 크다.

UpdatedAtGreaterThanEqual, UpdatedaT이 매개변수 updatedAt과 같거나 크다.

 

 

*ColumnDefinition 사용하기

 

@Data
@MappedSuperclass
@EntityListeners(value = AuditingEntityListener.class)
public class BaseEntity extends implements Auditable {
@CreatedDate
@Column(nullable = false, updatable = false)
private LocalDateTime createdAt;

@LastModifiedDate
@Column(nullable = false)
private LocalDateTime updatedAt;
}

 

@Column으로 해당 칼럼에 제약 조건을 추가할 수 있다. createdAt은 처음 생성될 때 null일 수 없고 업데이트를 할 수

없다. updatedAt은 처음 생성될 때 null일 수가 없다. 

 

콘솔에는 다음과 같은 테이블이 생성된다.

 

create table book (
...
created_at datetime(6) not null,
updated_at datetime(6) not null,
...
)

 

 

 

@ColumnDeifinition은 ddl에 반영되어 칼럼이 생성된다. 따라서 data.sql에 createdAt과 updatedAt을 넣어주지 않아도 알아서 시간 값을 넣어준다. (단, 운영에서는 ddl로 테이블을 생성하지 않으므로 잘 쓰이지 않는 방법이다.)

 

@Data
@MappedSuperclass
@EntityListeners(value = AuditingEntityListener.class)
public class BaseEntity extends implements Auditable {
@CreatedDate
@Column(columnDefinition="datetime(6) default now(6)", nullable = false, updatable = false)
private LocalDateTime createdAt;

@LastModifiedDate
@Column(columnDefinition="datetime(6) default now(6)", nullable = false)
private LocalDateTime updatedAt;
}

 

default now(6)로 인해 data.sql을 사용하든지, AuditingListener.class를 사용하든지 not null인 now(6)값이 들어가도록 default가 설정된다. 

 

 

@Column(columnDefinition="datetime(6) default now()", nullable = false, updatable = false)

 

now(6)가 아닌 now()를 사용하면 오류가 나기 때문에 유의한다.

 

 

create table book (
...
created_at default now(6) not null,
updated_at default now(6) not null,
...
)

 

이제 datetime(6) 대신에 default now(6)로 테이블이 생성된다.

 

 

 

*주의

@Column(columnDefinition="datetime(6) default null", nullable = false, updatable = false)
private LocalDateTime createdAt;

@LastModifiedDate
@Column(columnDefinition="datetime(6) default null", nullable = false)
private LocalDateTime updatedAt;

 

create table book (
...
created_at default now(6) null not null,
updated_at default now(6) null not null,
...
)

 

columnDefinitionnullable은 별개로 작동하기 떄문에 default null을 입력하면 논리적으로 맞지 않는  null not null이 출력된다. 서로 유효성 검사를 하지 않기 때문에 주의해서 사용해야 한다.

 

 

 

*comment 추가하기

 

@Column(columnDefinition="datetime(6) default now(6) comment='생성시간'", nullable = false, updatable = false)
private LocalDateTime createdAt;

@LastModifiedDate
@Column(columnDefinition="datetime(6) default now(6) comment='생성시간'", nullable = false)
private LocalDateTime updatedAt;

 

 comment로 칼럼명을 정할 수 있지만, 운영에서는 auto-ddl을 사용하지 않기 때문에 참고로 알아둔다.

 

 

반응형

'학습 > DB' 카테고리의 다른 글

Cascade 활용하기  (0) 2021.09.26
@Query 활용하기 2  (0) 2021.09.26
Transaction 격리수준  (0) 2021.09.26
db Transaction(롤백처리)  (0) 2021.09.26
JPA 값 타입  (0) 2021.09.18