2014-09-14 32 views
13

Cách tốt nhất để tích hợp Java 8 Date Time api trong jpa là gì?Java 8 Ngày giờ api trong JPA

chuyển đổi Tôi đã thêm:

@Converter(autoApply = true) 
public class LocalDatePersistenceConverter implements AttributeConverter<LocalDate, Date> { 

    @Override 
    public Date convertToDatabaseColumn(LocalDate localDate) { 
     return Date.valueOf(localDate); 
    } 

    @Override 
    public LocalDate convertToEntityAttribute(Date date) { 
     return date.toLocalDate(); 
    } 
} 

@Converter(autoApply = true) 
public class LocalDateTimePersistenceConverter implements AttributeConverter<LocalDateTime, Timestamp> { 
    @Override 
    public Timestamp convertToDatabaseColumn(LocalDateTime entityValue) { 
     return Timestamp.valueOf(entityValue); 
    } 

    @Override 
    public LocalDateTime convertToEntityAttribute(Timestamp databaseValue) { 
     return databaseValue.toLocalDateTime(); 
    } 
} 

Tất cả mọi thứ có vẻ tốt đẹp, nhưng làm thế nào tôi nên sử dụng JPQL để truy vấn? Tôi đang sử dụng Spring JPARepository và mục tiêu là chọn tất cả các thực thể mà ngày tháng giống như ngày đã cho, khác biệt duy nhất là nó được lưu trong thực thể như LocalDateTime.

Vì vậy:

public class Entity { 

    private LocalDateTime dateTime; 

    ... 
} 

Và:

@Query("select case when (count(e) > 0) then true else false end from Entity e where e.dateTime = :date") 
public boolean check(@Param("date") LocalDate date); 

Khi thực hiện nó chỉ mang lại cho tôi có ngoại lệ, đó là chính xác.

Caused by: java.lang.IllegalArgumentException: Parameter value [2014-01-01] did not match expected type [java.time.LocalDateTime (n/a)] 

Tôi đã thử nhiều cách, nhưng có vẻ như không có cách nào hoạt động, thậm chí có thể không?

+0

Trường của bạn thuộc loại LocalDateTime. Tham số của bạn thuộc loại LocalDate. Nó phải thuộc loại LocalDateTime. Điều gì xảy ra khi bạn thực hiện truy vấn? –

+0

Có, tôi hiểu rằng, tôi cần phải tiết kiệm datetime nhưng truy vấn theo ngày. – sandris

+1

Sau đó, tại sao không sử dụng 'date.atStartOfDay()' để chuyển đổi LocalDate của bạn thành LocalDateTime? Thông báo lỗi cho bạn biết chính xác rằng tham số không phải là kiểu đúng và phải là kiểu LocalDateTime. –

Trả lời

0

Bạn có thêm LocalDatePersistenceConverter và LocalDateTimePersistenceConverter vào persistence.xml được đặt trong phần tử 'class' không?

1

Để truy vấn trường thời gian, bạn nên sử dụng @Temporal Anotation trong các trường thời gian, thêm bộ chuyển đổi vào persistence.xml và cũng chắc chắn rằng bạn đang sử dụng java.sql.Date, java.sql.Time hoặc java.sql .Timestamp trong trình biến đổi. (Đôi khi tôi nhập khẩu từ các gói sai)

ví dụ thats công trình cho tôi:

@Temporal(TemporalType.TIMESTAMP) 
@Convert(converter = InstantPersistenceConverter.class) 
private Instant StartInstant; 
@Temporal(TemporalType.TIME) 
@Convert(converter = LocalTimePersistenceConverter.class) 
private LocalTime StartTime; 

và chuyển đổi tức thì của tôi:

@Converter(autoApply = true) 
public class InstantPersistenceConverter implements AttributeConverter <Instant,java.sql.Timestamp>{ 
@Override 
public java.sql.Timestamp convertToDatabaseColumn(Instant entityValue) { 
    return java.sql.Timestamp.from(entityValue); 
} 

@Override 
public Instant convertToEntityAttribute(java.sql.Timestamp databaseValue) { 
    return databaseValue.toInstant(); 
} 

}

6

Hibernate có một thư viện mở rộng, hibernate-java8 Tôi tin, vốn hỗ trợ nhiều loại thời gian.

Bạn nên sử dụng nó trước khi viết trình chuyển đổi.

trong hibernate 5.2 bạn sẽ không cần thư viện bổ sung này, nó là một phần cốt lõi.

Các vấn đề liên quan