2017-09-27 1 views
2

LocalDate 필드 (예 : '2017-09-27')를 JPA CriteriaBuilder API를 사용하여 mySQL Date 열에 저장하면 결과가 달라집니다 (예 : '2017- 09-26 ').mySQL 데이터베이스에 저장할 때 LocalDate가 변경되지 않게하는 방법

데이터베이스의 시간대가 SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)을 사용하는 UTC로 설정되어 있는지 확인한 결과 '00 : 00 : 00'입니다.

GMT + 2의 시간대를 사용하고 있으므로 LocalDate에서 Date으로 변환 될 때 2 시간이 공제되고 요청 날짜 1 일 전에 날짜가 생성됩니다. LocalDate 필드가,이 더 시간 정보를 없는 결과로 00:00:00로 취급되고 있음을 가정.

이 상황에서 LocalDates을 저장하는 가장 좋은 방법은 무엇입니까?해야 내가 조언을 다음과 같은 수 여기에 https://stackoverflow.com/a/29751575/3832047과 모든 LocalDate 필드를 UTC 또는 이와 유사한 것으로 명시 적으로 설정하면

나는 코드를 변환 할 때 어떻게되는지 테스트를 실행하고 다음과 같은 결과를 얻었다 :

Date convertedDate = Date.valueOf(localDate); 

conversion-result

여기에 편집

내가 데이터를 검색하는 데 사용하는 코드의 예입니다 , 홀수 날짜 변경도 발생합니다. 2017-06-27에 대한 데이터를 요청하면 2017-06-26에 대한 결과가 표시됩니다. LocalDate 더 시간대가 없기 때문에

CriteriaBuilder criteriaBuilder = sessionFactory.getCriteriaBuilder(); 
CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(HorseAndTrailerRequest.class); 
Root<HorseAndTrailerRequest> criteria = criteriaQuery.from(HorseAndTrailerRequest.class); 

ParameterExpression<LocalDate> effectiveDateParameter = criteriaBuilder.parameter(LocalDate.class); 
    criteriaQuery.select(criteria) 
      .where(
        criteriaBuilder.equal(criteria.get("effectiveDate"), effectiveDateParameter) 
      ); 

TypedQuery<HorseAndTrailerRequest> query = sessionFactory.getCurrentSession().createQuery(criteriaQuery); 
query.setParameter(effectiveDateParameter, date); 
return query.getResultList(); 
+0

자바를'LocalDate' 객체에는 시간 또는 시간대 정보가 저장되지 않습니다 ([Javadoc] (https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html)] 참조), 다른 것으로 의심됩니다. –

+0

시도해 볼 수 있습니까? 다음을 실행하여 MySQL 서버 시간대를 확인하십시오 : SELECT @@ system_time_zone, NOW(), UTC_TIMESTAMP()' –

+0

@TimBiege leisen 결과는'UTC | 2017-09-27 11:28:51 | 2017-09-27 11 : 28 : 51'. – Phobos

답변

0

, 당신은 당신의 데이터베이스 스키마만큼 column_date지도, 시간 영역 변환 문제를 방지하기 위해 긴에 LocalDate 변환 AttributeConverter를 사용할 수 있습니다

import javax.persistence.Converter; 
import java.time.LocalDate; 
import javax.persistence.AttributeConverter; 
@Converter 
public class LocalDateToLong implements AttributeConverter<LocalDate, Long> { 

    @Override 
    public Long convertToDatabaseColumn(LocalDate date) { 
     if (date != null) { 
      long epochDay = date.toEpochDay(); 
      return epochDay; 
     } 
     return null; 
    } 

    @Override 
    public LocalDate convertToEntityAttribute(Long epochDay) { 
     // TODO Auto-generated method stub 
     if (epochDay != null) { 
      LocalDate date = LocalDate.ofEpochDay(epochDay); 
      return date; 
     } 
     return null; 
    } 

} 
관련 문제