Convertir float / int en Calendrier dans jpa hibernate SQL Server

Je développe un projet Java avec JPA / Hibernate et SQL Server DB.

J'ai un db existant où les champs de date sont stockés comme int et datetime comme float.

Est-ce que quelqu'un sait comment je peux implémenter une conversion transparente à un type de calendar dans ma class de domaine?

Je dois calculer la date dans getter et setter ou il y a un meilleur moyen?

Je vous remercie! Marco

Je le ferais comme suit:

  1. Deux classs, MyDate et MyDateTime implémentent chacune l'interface Hibernate UserType .
  2. MyDate lira la date de l'entier sous forme de string, en supposant que l'entier est au format 20120828. Dans l' nullSafeGet() , il convertira cette string en Joda DateTime ou Java.util.Date utilisant la class SimpleDateFormat avec le format "yyyyMMdd" .
  3. MyDateTime lit le float tant que Ssortingng , en supposant que le float est au format 20120828.190800. Dans l' nullSafeGet() , elle convertira également cette string en Joda Datetime ou en java.util.Date utilisant la class SimpleDateFormat avec le format "yyyyMMdd.HHmmss".
  4. Le nullSafeSet() formatera datatables en utilisant le même SimpleDateFormat dans les classs respectives.

J'espère que cela t'aides.

Voici ma solution! L'espoir est utile pour quelqu'un!

Comme suggéré par Vikdor j'ai implémenté l'interface UserType:

 public class MyDate implements UserType{ private final static int SECONDS_IN_A_DAY = 86400; @Override public Object assemble(Serializable cached, Object owner) throws HibernateException { return cached; } @Override public Object deepCopy(Object value) throws HibernateException { if (value == null) return null; return value; } @Override public Serializable disassemble(Object value) throws HibernateException { return (Serializable)value; } @Override public boolean equals(Object x, Object y) throws HibernateException { return ObjectUtils.equals(x, y); } @Override public int hashCode(Object x) throws HibernateException { assert (x != null); return x.hashCode(); } @Override public boolean isMutable() { return false; } @Override public Object nullSafeGet(ResultSet resultSet, Ssortingng[] names, Object owner) throws HibernateException, SQLException { assert names.length == 1; final Ssortingng value = (Ssortingng) SsortingngType.INSTANCE.get(resultSet, names[0]); if (value == null) return null; try{ final Ssortingng daysValue = value.subssortingng(0, value.indexOf(".")); final Ssortingng secondsValue = value.subssortingng(value.indexOf(".")); final Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.YEAR, 1900); calendar.setTime(DateUtils.truncate(calendar, Calendar.YEAR).getTime()); calendar.add(Calendar.DATE, Integer.valueOf(daysValue)); calendar.add(Calendar.SECOND, (int)(SECONDS_IN_A_DAY * Float.valueOf(secondsValue))); return calendar; }catch(Exception e){ throw new HibernateException("Cannot convert DB value " +value); } } @Override /** * Convert from date to float */ public void nullSafeSet(PreparedStatement preparedStatement, Object value, int index) throws HibernateException, SQLException { final Calendar currentDate = (Calendar) value; final Calendar zeroDate = Calendar.getInstance(); zeroDate.set(Calendar.YEAR, 1900); zeroDate.setTime(DateUtils.truncate(zeroDate, Calendar.YEAR).getTime()); final Days days = Days.daysBetween(new DateTime(zeroDate), new DateTime(currentDate) ); final Seconds seconds = Seconds.secondsBetween(new DateTime(DateUtils.truncate(currentDate, Calendar.DAY_OF_MONTH).getTime()), new DateTime(currentDate) ); float finalValue = days.getDays() + ((float)seconds.getSeconds()/SECONDS_IN_A_DAY); preparedStatement.setFloat(index, finalValue); } @Override public Object replace(Object original, Object target, Object owner) throws HibernateException { return original; } @Override public Class<Calendar> returnedClass() { return Calendar.class; } @Override public int[] sqlTypes() { return new int[]{ FloatType.INSTANCE.sqlType() }; } }