개요
이 가이드 에서는 하이버네이트 ORM용 MongoDB 확장을 사용하여 날짜/시간 필드 에서 하이버네이트 쿼리 언어(HQL) extract() 및 format() 함수를 호출하는 방법을 학습 수 있습니다. extract()를 사용하여 날짜/시간 값의 일부를 반환하고 format()를 사용하여 날짜/시간 값을 문자열로 렌더링할 수 있습니다.
하이버네이트 ORM 확장은 $project 단계에서 각 호출을 MongoDB 집계 표현식 으로 변환합니다. SELECT 절의 날짜/시간 필드 에서 두 함수를 호출할 수 있습니다.
참고
시간대
최대 절전 모드 ORM 확장은 애플리케이션 실행하는 JVM 의 기본값 구역 에서 각 날짜/시간 함수를 확인합니다. 생성된 연산자 의 timezone 인수로 해당 구역 MongoDB 에 전달합니다. 서로 다른 표준 시간대로 구성된 호스트에서 동일한 쿼리 서로 다른 값을 반환할 수 있습니다.
하이버네이트 ORM 확장은 계산된 표현식 의 피연산자로서의 함수 호출을 지원 하지 않기 때문에 날짜/시간 함수를 산술 연산자 와 결합할 수 없습니다. 자세히 학습 쿼리 지정 가이드 의 계산된 표현식 사용 섹션을 참조하세요.
샘플 데이터
이 가이드 의 예제에서는 Atlas 샘플 데이터 세트의 sample_mflix.movies 컬렉션 나타내는 Movie 엔터티를 사용합니다. Movie 엔터티의 정의는 다음과 같습니다.
import com.mongodb.hibernate.annotations.ObjectIdGenerator; import org.bson.types.ObjectId; import java.time.Instant; import java.util.List; import jakarta.persistence.Embedded; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; import jakarta.persistence.Id; import jakarta.persistence.OneToMany; import jakarta.persistence.Table; public class Movie { private ObjectId id; private String title; private String plot; private int year; private List<String> cast; private List<String> directors; private Instant released; private Awards awards; private List<Comment> comments; public Movie(String title, String plot, int year, List<String> cast, List<String> directors, Instant released, Awards awards) { this.title = title; this.plot = plot; this.year = year; this.cast = cast; this.directors = directors; this.released = released; this.awards = awards; } public Movie() { } public ObjectId getId() { return id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getPlot() { return plot; } public void setPlot(String plot) { this.plot = plot; } public int getYear() { return year; } public void setYear(int year) { this.year = year; } public List<String> getCast() { return cast; } public void setCast(List<String> cast) { this.cast = cast; } public List<String> getDirectors() { return directors; } public void setDirectors(List<String> directors) { this.directors = directors; } public Awards getAwards() { return awards; } public void setAwards(Awards awards) { this.awards = awards; } public Instant getReleased() { return released; } public void setReleased(Instant released) { this.released = released; } public List<Comment> getComments() { return comments; } public void setComments(List<Comment> comments) { this.comments = comments; } }
최대 절전 모드용 MongoDB 확장 ORM을 사용하여 이 MongoDB 샘플 컬렉션과 상호 작용하는 Java 애플리케이션 만드는 방법을 학습하려면 시작하기 튜토리얼을 참조하세요.
이 가이드 의 예시에서는 Instant 값을 저장하는 Movie 엔터티의 released 필드 사용합니다.
날짜/시간 필드 추출
extract() 함수를 사용하여 날짜/시간 값의 특정 부분(예: 연도, 월, 일)을 반환할 수 있습니다.
extract(field from x) 함수는 날짜/시간 값의 단일 필드 반환합니다. 최대 절전 모드 ORM 확장은 field에 대해 다음 값을 지원합니다.
필드 | MongoDB 번역 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Unix epoch 이후의 전체 시간(초)으로 계산됩니다. |
다음 예시 sample_mflix.movies 컬렉션 에 있는 각 "Hairspray" 영화의 제목과 영화가 개봉된 연도를 반환합니다.
var extractResult = session.createQuery( "select title, extract(year from released) as releaseYear from Movie where title = :title", Object[].class) .setParameter("title", "Hairspray") .getResultList(); for (var row : extractResult) { System.out.println("Title: " + row[0] + ", Release Year: " + row[1]); }
var extractResult = entityManager.createQuery( "select m.title, extract(year from m.released) as releaseYear from Movie m where m.title = :title", Object[].class) .setParameter("title", "Hairspray") .getResultList(); for (var row : extractResult) { System.out.println("Title: " + row[0] + ", Release Year: " + row[1]); }
최대 절전 모드 ORM 확장은 앞의 쿼리 다음 $project 단계로 변환하며, 여기서 America/New_York은 JVM 의 기본값 구역 입니다.
{ "$project": { "title": true, "releaseYear": { "$year": { "date": "$released", "timezone": { "$literal": "America/New_York" } } }, "_id": 0 } }
중요
요일 번호 매기기
day of week 필드 일요일의 1부터 토요일의 7까지의 일수를 계산한 MongoDB $dayOfWeek 값을 반환합니다. 이는 월요일의 1부터 일요일의 7까지 일수를 계산하는 Java DayOfWeek 열거형 과 다릅니다.
최대 절전 모드 ORM 확장은 date, time, offset, timezone_hour 및 timezone_minute 필드를 지원 하지 않습니다. 지원되지 않는 필드 추출하는 쿼리 FeatureNotSupportedException를 발생시킵니다.
날짜/시간 형식을 문자열로 지정
format(x as pattern) 함수는 날짜/시간 값을 문자열로 렌더링합니다. 하이버네이트 ORM 확장은 MongoDB $dateToString 연산자 에 대한 호출을 변환하고 각 패턴 코드를 동등한 MongoDB 형식 지정자에 매핑합니다. 함수를 format(x, pattern)로 호출하고 MongoDB 형식 지정자를 직접 전달할 수도 있습니다.
최대 절전 모드 ORM 확장은 다음 패턴 코드를 지원합니다.
패턴 코드 | 설명 | MongoDB 지정자 |
|---|---|---|
| 네 자리 연도 |
|
| 4자리 ISO-8601 주 기반 연도 |
|
| 두 자리 월 |
|
| 축약된 월 이름 |
|
| 월 이름 전체 |
|
| 두 자리 ISO-8601 주 번호 |
|
| 해당 월의 두 자리 일 |
|
| 연중무휴 |
|
| 24 시간 시계의 두 자리 시간 |
|
| 두 자리 분 |
|
| 두 자리 초 |
|
| 세 자리 밀리초 |
|
| UTC 오프셋 |
|
MongoDB 미국 국가 및 언어 설정 으로 월과 일 이름을 반환합니다. 작은따옴표로 묶은 문자는 패턴 코드로 해석되지 않고 출력으로 전달됩니다.
다음 예시 각 "Hairspray" 영화의 제목과 출시하다 날짜를 yyyy-MM-dd 문자열로 반환합니다.
var formatResult = session.createQuery( "select title, format(released as 'yyyy-MM-dd') as releaseDate from Movie where title = :title", Object[].class) .setParameter("title", "Hairspray") .getResultList(); for (var row : formatResult) { System.out.println("Title: " + row[0] + ", Release Date: " + row[1]); }
대신 MongoDB 형식 지정자를 사용하려면 함수를 format(released, '%Y-%m-%d')(으)로 호출하면 됩니다.
var formatResult = entityManager.createQuery( "select m.title, format(m.released as 'yyyy-MM-dd') as releaseDate from Movie m where m.title = :title", Object[].class) .setParameter("title", "Hairspray") .getResultList(); for (var row : formatResult) { System.out.println("Title: " + row[0] + ", Release Date: " + row[1]); }
대신 MongoDB 형식 지정자를 사용하려면 함수를 format(m.released, '%Y-%m-%d')(으)로 호출하면 됩니다.
하이버네이트 ORM 확장은 앞의 쿼리 다음 $project 단계로 변환합니다.
{ "$project": { "title": true, "releaseDate": { "$dateToString": { "date": "$released", "format": { "$literal": "%Y-%m-%d" }, "timezone": { "$literal": "America/New_York" } } }, "_id": 0 } }
앞의 표 외부에 있는 패턴 코드를 사용하는 쿼리 FeatureNotSupportedException을 발생시킵니다. 여기에는 y, M , d, H, h, m, s, a와 같은 단일 문자 및 가변 너비 코드가 포함됩니다. 지정합니다. ZZZZZZZ와 같이 3자를 초과하는 반복되는 구역 코드는 모호하며 예외를 발생시킵니다.
추가 정보
쿼리 필터를 만들고 쿼리 문에서 연산자를 사용하는 방법에 대해 자세히 학습 보려면 쿼리 지정 가이드 를 참조하세요.
HQL 및 JPQL을 사용하여 쿼리를 실행 방법에 대해 자세히 학습하려면 하이버네이트 ORM 문서에서 하이버네이트 쿼리 언어 가이드 를 참조하세요.