Проблема с датой при использовании Hibernate Annotated Java Class в Grails - PullRequest
1 голос
/ 29 февраля 2012

Я написал простой класс:

@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

Я не уверен, что я могу сделать, чтобы это заработало: /

Надеюсь, кто-нибудь может мне помочь.

Спасибо, Krystian

EDIT:

Я пытался использовать 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 Ответ

1 голос
/ 29 февраля 2012

Уххй ...

Все, потому что глупая ошибка.

SQLInsert должен выглядеть следующим образом:

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

Это без колонки ID !!

после удаления все стало работать нормально!

EDIT:

Вышеописанное работало нормально для HSQLDB. Когда я начал работать с postgres, у меня снова возникли странные ошибки. В конце концов мне пришлось добавить идентификатор, но ... что самое важное .. ? ? ? ? значения добавляются в том же порядке, в котором они были созданы [в выражении DDL].

Кроме того, вот ссылка на пример проекта, в котором используется все описанное:

https://github.com/krstns/grailsPostgresPartitioning

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...