Как работать с интервальным типом данных PostgreSQL, используя jdbc / spring-jdbc, не используя PGInterval?
Java дата и время типы данных, как все знают, нет необходимости фокусироваться на этом.
однако, когда я использую расширения JDBC или Spring, такие как SimpleJdbcTemplate для извлечения и хранения интервал значения, какой тип Java я должен использовать, если я не хочу использовать org.в PostgreSQL.утиль.Класс PGInterval?
этот класс является внутренним драйвером PostgreSQL, поэтому его использование сделает код специфичным для DB. Я думаю, что должна быть возможность оперировать интервалы в БД-агностический способ, потому что это один из стандартных типов SQL.
1 ответов
An интервал не является одним из стандартных типов JDBC, как указано в java.sql.Types
класса. Я знаю, что если вы позвоните resultSet.getObject("interval_column")
, это PGInterval
при кастинге, поэтому похоже, что драйвер PG JDBC может заставить вашу руку иметь дело с ним как таковым, если вы не сделаете то, что говорит Гленн, и не преобразуете его в строку или, возможно, число в вашем SQL.
в нашем приложении, мы используем JodaTime для всего нашего управления датами, и у нас есть тип спящего режима, написанный, что преобразует наше свойство bean в PGInterval
, и использовать getObject
и setObject
для связи с JDBC. Я сомневаюсь, что этот код поможет вам справиться с тем, что вы ищете здесь, но я могу поделиться им с вами, если вам интересно.
обновлено: вот класс типа Hibernate, который преобразует между временем Joda и PGInterval. Я знаю, что это не отвечает на вопрос, но оригинальный плакат попросил образец кода.
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");
}
}