2017-09-27 82 views
2

使用JPA CriteriaBuilder API將字段(例如'2017-09-27')保存到mySQL Date列時,結果不同(例如'2017- 09-26' )。如何在保存到mySQL數據庫時阻止LocalDate更改

我已驗證我的數據庫的時區設置爲UTC,使用SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)作爲結果'00:00:00'。

我在本地測試這個,我有GMT + 2的時區,所以我懷疑當轉換髮生從LocalDateDate時,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的結果。

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

的Java'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

由於LocalDate沒有的時區,你只要能在你的數據庫模式映射column_date,並使用AttributeConverterLocalDate轉換爲長,以避免時區轉換問題:

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; 
    } 

} 
相關問題