У меня есть метод с PreparedStatement
public static boolean TSTHolidayPrepMapper(PreparedStatement st, TSTObject item, MapperType type) throws SQLException
{
TSTHoliday hol = (TSTHoliday) item;
int id = 1;
if (type != MapperType.DELETE)
{
st.setString(id++, hol.getCountry());
st.setString(id++, hol.getCommodity());
st.setString(id++, hol.getMarketArea());
st.setString(id++, hol.getMarketPlace());
st.setString(id++, hol.getName());
st.setDate(id++, hol.getCalenderDate());
}
if (type != MapperType.INSERT)
st.setInt(id++, hol.getId());
return true;
}
который ожидает объект типа Date в st.setDate(id++, hol.getCalenderDate()), но метод getCalenderDate() предоставляет объект класса, который я создал сам, под названием TSTLocalDate
public class TSTLocalDate extends TSTObject
{
public int year;
public int month;
public int day;
public TSTLocalDate()
{
this.year = 1900;
this.month = 1;
this.day = 1;
}
public TSTLocalDate(int year, int month, int day)
{
this.year = year;
this.month = month;
this.day = day;
}
public String toString()
{
String val = "" + year + "-" + TSTStringFormatter.getIntWithLeadingZeros(month, 2) + "-" + TSTStringFormatter.getIntWithLeadingZeros(day, 2);
return val;
}
}
Я думал о двух разных решениях
Я попытался преобразовать свой TSTLocalDate calenderDate в Date calenderDate, но похоже, что он не работает, поскольку методы классов Date устарели.
@SuppressWarnings({ "deprecation"})
public Date tstlocaldateToDate(TSTLocalDate tstlocaldate) throws ParseException {
Date date = new Date(0);
date.setYear(tstlocaldate.year);
date.setMonth(tstlocaldate.month);
date.setDate(tstlocaldate.day);
Log.info(date.getYear());
return date;
}
st.setTSTLocalDate(id++, hol.getCalenderDate());, но, к сожалению, я не нашел способа, как это сделать.Я бы предпочел второе решение, но я открыт и для других решений.
@JonK - Или LocalDate.
Зачем вы создали кастомный тип TSTLocalDate, когда есть java.time.LocalDate и возможность сделать Date date = Date.valueOf(LocalDate localDate);? См. ответ, данный @T.J.Crowder
К сожалению, мне приходится использовать класс TSTLocalDate, потому что это требование, которое я получил с этой задачей.
Чтобы было ясно, мой ответ показывает, как использовать LocalDate для перехода от TSTLocalDate к java.sql.Date для PreparedStatement, он не рекомендует использовать LocalDateвместо для TSTLocalDate (хотя, конечно, если бы это был вариант...).
@T.J.Crowder, ваше решение очень хорошо подходит для этого.




...but it seems like it does not work well since the Date classes methods are deprecated.
Если вы посмотрите на сообщение об устаревании JavaDoc, это говорит вам, что делать:
Deprecated.
As of JDK version 1.1, replaced by
Calendar.set(Calendar.YEAR, year + 1900).
(мой акцент на втором абзаце)
Таким образом, старый способ будет заключаться в следующем:
Calendar, используя getInstance или одну из его перегрузок.Calendar, чтобы установить правильную дату.getTime, чтобы получить экземпляр Date для этой даты.java.sql.Date, передав DategetTime().PreparedStatement.Тем не менее, с современным JDK вы, вероятно, захотите пройти через классы java.time, возможно, LocalDate, чтобы выполнить преобразование, поскольку это немного проще. Тогда вы должны использовать java.sql.Date.valueOf(LocalDate):
ps.setDate(java.sql.Date.valueOf(LocalDate.of(
tstlocaldate.year,
tstlocaldate.month,
tstlocaldate.dayOfMonth
));
Вам действительно нужен класс
TSTLocalDate? Можете ли вы вместо этого использовать что-то вродеjava.sql.Timestamp?