在Grails中使用Hibernate Annotated Java Class时的日期问题

时间:2012-02-29 13:27:44

标签: java hibernate grails

我写了一个简单的类:

@Entity
@Table(name = "battle_log")
@SQLInsert(sql = "INSERT INTO battle_log (id, version, date_created, some_date) VALUES (?,?,?,?)", check = ResultCheckStyle.NONE)
@NamedQueries(value = {
        @NamedQuery(name = "BattleLog.findAll",
                query = "SELECT a FROM BattleLog a"),
        @NamedQuery(name = "BattleLog.findAllBySomeDate",
                query = "SELECT a FROM BattleLog a WHERE a.someDate = :someDate")
})
public class BattleLog implements Serializable {
    private Long id;
    private Integer version;

    private Date someDate;
    private Date created;

    public BattleLog() {
        created = new Date();
    }

    @Id
    @GeneratedValue
    public Long getId() {
        return id;
    }

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

    @Version
    @Column(name = "version")
    public Integer getVersion() {
        return version;
    }

    public void setVersion(Integer version) {
        this.version = version;
    }

    @Column(name = "date_created", nullable = false, columnDefinition = "timestamp")
    public Date getCreated() {
        return created;
    }

    public void setCreated(Date created) {
        this.created = created;
    }

    @Column(name = "some_date", columnDefinition = "timestamp")
    public Date getSomeDate() {
        return someDate;
    }

    public void setSomeDate(Date someDate) {
        this.someDate = someDate;
    }

}

简单的Bootstrap.groovy

    BattleLog blog = new BattleLog(someDate: new Date())
    blog.save()

    println("should be saved now")

我正在做一个测试项目,看看Grails和Postgres分区是如何协同工作的。 如果我注释掉@SQLInsert代码,一切都很好。当我拥有它时,我得到了这个例外:

Caused by: java.sql.SQLException: Wrong data type: java.lang.NumberFormatException: For input string: "2012-02-29 13:48:17.67"
    at org.hsqldb.jdbc.Util.throwError(Unknown Source)
    at org.hsqldb.jdbc.jdbcPreparedStatement.setParameter(Unknown Source)
    at org.hsqldb.jdbc.jdbcPreparedStatement.setTimestamp(Unknown Source)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.setTimestamp(DelegatingPreparedStatement.java:147)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.setTimestamp(DelegatingPreparedStatement.java:147)
    ... 29 more

我不知道如何才能让它发挥作用:/

希望有人可以帮助我。

谢谢, 克里斯蒂安

编辑:

我已经尝试过使用JodaTime,在与依赖项进行了一些斗争后,我让它运行,但是遇到了上面的错误。 我还回到了使用java.util.Date并使用@Temporal(TemporalType.DATE)TIMESTAMP但是出现了错误[对于日期,类似于时间戳,但有时间部分]:

Caused by: java.sql.SQLException: Wrong data type: java.lang.NumberFormatException: For input string: "2012-02-29"

我很确定我必须在SQLInsert查询中添加一些内容,将字符串转换为日期。但是,我不能找到任何东西。

1 个答案:

答案 0 :(得分:1)

...唔

一切都是因为一个愚蠢的错误。

SQLInsert应该如下所示:

@SQLInsert(sql = "INSERT INTO battle_log (date_created, some_date, version) VALUES (?,?,?)", check = ResultCheckStyle.NONE)

没有ID列!!

删除后,一切都开始正常工作了!

编辑:

以上版本适用于HSQLDB。当我开始使用postgres时,我又遇到了一些奇怪的错误。 最后我不得不添加ID,但......最重要的是...... 的? ? ? ?值的添加顺序与它们的创建顺序相同[在DDL语句中]。

此外,这里是一个示例项目的链接,其中使用了所描述的所有内容:

https://github.com/krstns/grailsPostgresPartitioning