【问题标题】:Hibernate/jpa Persisting Java Date to H2 DB Sql TimeStampHibernate/jpa 将 Java 日期持久化到 H2 DB Sql 时间戳
【发布时间】:2014-09-06 22:17:27
【问题描述】:

我正在尝试将实体创建日期作为时间戳保存到数据库 (h2) 中。 这是代码:

@Temporal(TemporalType.TIMESTAMP)
@Required
public Date creationDate = new.Date();

我得到的错误:

[PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute native bulk manipulation query] 
Caused by: org.h2.jdbc.JdbcSQLException: Blad skladniowy w wyrazeniu SQL "INSERT INTO MedicalIncident (customer_id, actionTakenAfterIncident, actionTypeTakenAfterIncident, year_id, age_id, incidentOccurencePatientInformation, month_id, sex_id, patientHarm, patientHarmType_id, patientHarmType_Other, unit_id, place_id, incidentType_id, incidentType_Diagnosis_id, incidentType_Infection_id, incidentType_MedicineApplication_id, incidentType_PatientRightsViolation_id, incidentType_Surgery_id, incidentType_Therapy_id, incidentType_WorkOrganization_id, incidenttype_other, creationDate ) VALUES (1,true,'Różniejsze',2014,37,false,02,1,true,4,'',12,5,3,null,null,null,null,2,null,null,','Wed Jul 16 13? CEST 2014[*]')"
    Syntax error in SQL statement "INSERT INTO MedicalIncident (customer_id, actionTakenAfterIncident, actionTypeTakenAfterIncident, year_id, age_id, incidentOccurencePatientInformation, month_id, sex_id, patientHarm, patientHarmType_id, patientHarmType_Other, unit_id, place_id, incidentType_id, incidentType_Diagnosis_id, incidentType_Infection_id, incidentType_MedicineApplication_id, incidentType_PatientRightsViolation_id, incidentType_Surgery_id, incidentType_Therapy_id, incidentType_WorkOrganization_id, incidenttype_other, creationDate ) VALUES (1,true,'Różniejsze',2014,37,false,02,1,true,4,'',12,5,3,null,null,null,null,2,null,null,','Wed Jul 16 13? CEST 2014[*]')"; SQL statement:
    INSERT INTO MedicalIncident (customer_id, actionTakenAfterIncident, actionTypeTakenAfterIncident, year_id, age_id, incidentOccurencePatientInformation, month_id, sex_id, patientHarm, patientHarmType_id, patientHarmType_Other, unit_id, place_id, incidentType_id, incidentType_Diagnosis_id, incidentType_Infection_id, incidentType_MedicineApplication_id, incidentType_PatientRightsViolation_id, incidentType_Surgery_id, incidentType_Therapy_id, incidentType_WorkOrganization_id, incidenttype_other, creationDate ) VALUES (1,true,'Różniejsze',2014,37,false,02,1,true,4,'',12,5,3,null,null,null,null,2,null,null,','Wed Jul 16 13? CEST 2014') [42000-172]
        at org.h2.message.DbException.getJdbcSQLException(DbException.java:329) ~[h2.jar:1.3.172]
        at org.h2.message.DbException.get(DbException.java:169) ~[h2.jar:1.3.172]
        at org.h2.message.DbException.get(DbException.java:146) ~[h2.jar:1.3.172]
        at org.h2.message.DbException.getSyntaxError(DbException.java:181) ~[h2.jar:1.3.172]
        at org.h2.command.Parser.getSyntaxError(Parser.java:484) ~[h2.jar:1.3.172]
        at org.h2.command.Parser.checkRunOver(Parser.java:3318) ~[h2.jar:1.3.172]
        at org.h2.command.Parser.initialize(Parser.java:3234) ~[h2.jar:1.3.172]
        at org.h2.command.Parser.parse(Parser.java:266) ~[h2.jar:1.3.172]
        at org.h2.command.Parser.parse(Parser.java:255) ~[h2.jar:1.3.172]
        at org.h2.command.Parser.prepareCommand(Parser.java:218) ~[h2.jar:1.3.172]
        at org.h2.engine.Session.prepareLocal(Session.java:425) ~[h2.jar:1.3.172]
        at org.h2.engine.Session.prepareCommand(Session.java:374) ~[h2.jar:1.3.172]
        at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1138) ~[h2.jar:1.3.172]
        at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:70) ~[h2.jar:1.3.172]
        at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:267) ~[h2.jar:1.3.172]
        at com.jolbox.bonecp.ConnectionHandle.prepareStatement(ConnectionHandle.java:1024) ~[bonecp.jar:na]
        at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:534) ~[hibernate-core-3.6.9.Final.jar:3.6.9.Final]
        at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:116) ~[hibernate-core-3.6.9.Final.jar:3.6.9.Final]
        at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:109) ~[hibernate-core-3.6.9.Final.jar:3.6.9.Final]
        at org.hibernate.engine.query.NativeSQLQueryPlan.performExecuteUpdate(NativeSQLQueryPlan.java:202) ~[hibernate-core-3.6.9.Final.jar:3.6.9.Final]
        ... 30 common frames omitted

我认为这是由不正确的日期格式引起的。 日期是这样的: '13 年 7 月 16 日星期三? 2014 年欧洲中部会议' 时间戳是一个数字 f.e.: 124144324

我还创建了 clear 类来检查时间持久性。 这是代码

    package models;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import play.db.jpa.JPA;
import play.db.jpa.Transactional;

@Entity
public class Uss {

    @Id
    public Long id; 
    @Column(name="name")  
    public  String name;
    @Temporal(TemporalType.TIMESTAMP)
    public Date createDate = new Date();


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getCreateDate() {
        return createDate;
    }

    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }

 public String toString() {
     return "uss class: name=" + this.name + ", id=" + this.id + ", createDate=" + this.createDate; 
 }
 public int toDatabase() {
     JPA.em().persist(this);
    return 1;

 }

@Transactional
public static Uss getById(Long id) {
    return JPA.em().find(Uss.class, id);
}

}

这个很好用。在数据库中,我有时间戳列,其中包含以下条目: 2014-07-17 10:24:14.357 当我得到这个实体时,我可以像使用 java.util.date 对象一样使用时间戳(因为它是 java.util.date 对象)

在我的第一个示例(一个 dosnt 工作)中,我不使用持久方法。 我正在使用“本机查询”

String sqlQueryString = "Insert into table () values ();
Query tempQuery = JPA.em().createNativeQuery(sqlQueryString);
    tempQuery.executeUpdate();

【问题讨论】:

  • 请添加堆栈跟踪和生成的查询。
  • 13 年 7 月 16 日星期三? CEST 2014' 是 java.util.Date 的 toString() 表示,而 124144324 是纪元。 H2 TIMESTAMP type 表示为 yyyy-MM-dd hh:mm:ss。你在使用 java.sql.Date 吗?
  • 不,我使用 java.util.date
  • 我应该使用 java.sql.date 而不是 java.utlil.date???

标签: java sql hibernate persistence


【解决方案1】:

我终于成功了。

变量声明:

@Temporal(TemporalType.TIMESTAMP)
public Date createDate;

插入方法:

String sqlQuery = "INSERT INTO Incident "
            + "(customer_id, unit_id, place_id, "
            + "incidentType_id, createDate ) "
            + "VALUES ("+ this.customer.id +","+ this.unit.id +","+ this.place.id +","
            + this.incidentType.id +",'"+ Index.getDate("yyyy-MM-dd HH:mm:ss") + "')" ;
Query tempQuery = JPA.em().createNativeQuery(sqlQuery);
tempQuery.executeUpdate();

或者只是坚持模型类:

     JPA.em().persist(this);

在数据库中,我终于输入了 sql 时间戳类型的日期,f.e.:

CREATEDATE  
2014-07-17 15:56:28.0

【讨论】:

    猜你喜欢
    • 2012-06-18
    • 2014-09-08
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 2014-05-16
    • 2014-12-03
    相关资源
    最近更新 更多