首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在不使用PGInterval的情况下使用jdbc/spring-jdbc操作PostgreSQL间隔数据类型?

如何在不使用PGInterval的情况下使用jdbc/spring-jdbc操作PostgreSQL间隔数据类型?
EN

Stack Overflow用户
提问于 2012-01-04 21:43:47
回答 1查看 14.7K关注 0票数 19

Java日期和时间数据类型是众所周知的,没有必要关注这一点。

但是,当我使用JDBC或基于Spring的扩展(比如SimpleJdbcTemplate )来检索和存储interval Java值时,如果我不想使用org.postgresql.util.PGInterval类,我应该使用什么类型?

此类是PostgreSQL驱动程序的内部类,因此使用它将使代码特定于DB。我认为应该可以以与DB无关的方式对间隔进行操作,因为它是标准的SQL类型之一。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-22 08:04:48

JDBC 不是java.sql.Types类中列出的标准类型之一。我知道如果你调用resultSet.getObject("interval_column"),当它被强制转换时,它是一个PGInterval,所以看起来PG驱动程序可能会强迫你这样处理它,除非你按照Glenn说的做,并在你的SQL中把它转换成一个字符串,或者一个数字。

在我们的应用程序中,我们使用JodaTime进行所有数据管理,并且编写了Hibernate类型,将bean属性与PGInterval进行来回转换,并使用getObjectsetObject与JDBC进行通信。我怀疑这些代码会帮助你处理你在这里寻找的东西,但如果你感兴趣的话,我可以和你分享。

更新:这是在Joda Time和PGInterval之间进行转换的Hibernate Type类。我知道这并没有回答这个问题,但是最初的发帖要求提供示例代码。

代码语言:javascript
复制
package com.your.package.hibernate.types;

import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;

import org.hibernate.HibernateException;
import org.hibernate.usertype.UserType;
import org.joda.time.DurationFieldType;
import org.joda.time.Period;
import org.joda.time.ReadableDuration;
import org.joda.time.ReadablePeriod;
import org.postgresql.util.PGInterval;

public class JodaTimeDurationType
    implements UserType {

    public Class<?> returnedClass() {
        return ReadableDuration.class;
    }


    public int[] sqlTypes() {
        return new int[] {Types.OTHER};
    }


    public Object nullSafeGet(ResultSet resultSet, String[] names, Object owner)
        throws HibernateException, SQLException {

        try {
            final PGInterval pgi = (PGInterval)resultSet.getObject(names[0]);

            final int years = pgi.getYears();
            final int months = pgi.getMonths();
            final int days = pgi.getDays();
            final int hours = pgi.getHours();
            final int mins = pgi.getMinutes();
            final double secs = pgi.getSeconds();

            return new Period(years, months, 0, days, hours, mins, (int)secs, 0).toStandardDuration();

        }
        catch (Exception e) {
            return null;
        }
    }


    public void nullSafeSet(PreparedStatement statement, Object value, int index)
        throws HibernateException, SQLException {

        if (value == null) {
            statement.setNull(index, Types.OTHER);
        }
        else {
            final ReadablePeriod period = ((ReadableDuration)value).toPeriod();

            final int years = period.get(DurationFieldType.years());
            final int months = period.get(DurationFieldType.months());
            final int days = period.get(DurationFieldType.days());
            final int hours = period.get(DurationFieldType.hours());
            final int mins = period.get(DurationFieldType.minutes());
            final int secs = period.get(DurationFieldType.seconds());

            final PGInterval pgi = new PGInterval(years, months, days, hours, mins, secs);
            statement.setObject(index, pgi);
        }
    }


    public boolean equals(Object x, Object y)
        throws HibernateException {

        return x == y;
    }


    public int hashCode(Object x)
        throws HibernateException {
        return x.hashCode();
    }


    public Object deepCopy(Object value)
        throws HibernateException {
        return value;
    }


    public boolean isMutable() {
        return false;
    }


    public Serializable disassemble(Object value)
        throws HibernateException {
        throw new HibernateException("not implemented");
    }


    public Object assemble(Serializable cached, Object owner)
        throws HibernateException {
        throw new HibernateException("not implemented");
    }


    public Object replace(Object original, Object target, Object owner)
        throws HibernateException {
        throw new HibernateException("not implemented");
    }
}
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8727900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档