2016-12-29 70 views
0

型号 的Postgres +休眠+ NativeQuery:乔达日期时间到Postgres的TIMSTAMP

package domain; 
@Entity @lombok.Getter @lombok.Setter 
public class Event implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(generator = "uuid2") 
    @GenericGenerator(name = "uuid2", strategy = "uuid2") 
    @Type(type="pg-uuid") 
    private UUID uuid; 

    @Column(columnDefinition = "TIMESTAMP", updatable = false) 
    @CreatedDate 
    @Temporal(TemporalType.TIMESTAMP) 
    @Type(type= "PersistentDateTime") // typedef in package-info.java 
    private DateTime createdAt; // Joda's DateTime 
} 

package repository; 
@Repository 
public interface EventRepository extends JpaRepository<Event, UUID> { 

    // Has to be native query 
    @Query(value = "SELECT * FROM events WHERE created_at >= :created_at ", nativeQuery = true) 
    List<Event> findCreatedSince(@Param(value = "created_at") DateTime createdAt); 

} 

当我打电话findCreatedSince(someDateTime)它抛出PSQLException有消息"cannot cast type bytea to timestamp without time zone"。 (事情是当它是正常的JPQL时,没有抱怨,实际上数据可以使用标准JPA存储库方法存储和检索)。 为了记录在案,我得到了下面的日志(注VARBINARY)调用方法时:

[main] TRACE BasicBinder – binding parameter [1] as [VARBINARY] - [1970-01-01T01:00:00.000+01:00]

对于临时分辨率更改的createdAt类型java.util.Date,但我想知道怎么用Joda的DateTime类型。提前致谢。

+0

也许你的JPA提供者不支持Jodatime类型的开箱即用?我使用的JPA提供程序(DataNucleus)确实存在,但Jodatime类型未包含在JPA规范中。 –

+0

正如我在帖子中提到的,由于正常的JPQL调用工作得很好,我不认为这是问题所在。 – Rad

+0

如果有东西将某个列映射为“bytea”,那么它不起作用。 Hibernate生成了你的模式?它将Jodatime字段设置为“bytea”?即序列化。 –

回答

0

在库,改变日期时间为日期:

List<Event> findCreatedSince(@Param(value = "created_at") Date createdAt); 

当你使用:

...findCreatedSince(Date.valueOf(createdAt))