Я нуб из Java, работаю в Spring, использую сгенерированные Roo модели, которые я настроил.
Мне нужно выбрать записи определенного типа (в данном случае, аренды), у которых есть «maturationDate» в течение X дней. Для отображения я создал свойство @Transient
, которое выполняет математические операции:
@Transient
private Integer daysToMaturation;
@PostLoad
public void postLoad() {
Calendar calendar1 = Calendar.getInstance();
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(this.getMaturesDate());
calendar1.setTime(new Date());
long milis1 = calendar1.getTimeInMillis();
long milis2 = calendar2.getTimeInMillis();
long day = milis2 - milis1;
Double diffDays = Math.ceil(day / (24 * 60 * 60 * 1000));
this.daysToMaturation = diffDays.intValue();
}
Это нормально для вывода, но теперь мне нужно найти все записи, где daysToMaturation <= что угодно, и, очевидно, это свойство не существует до окончания запроса. </p>
Функции даты JPQL трагически примитивны. Если бы я мог добраться до необработанного SQL (возможно, в поле @Formula
), я мог бы справиться с этим в одной строке. Что я действительно хочу, так это умение сказать следующее:
@Formula("(select datediff(maturesDate, CURRENT_DATE())")
private Integer daysToMaturation;
... но это терпит неудачу, предположительно потому, что я не говорю datediff()
MySQL, я говорю это JPA, который никогда не слышал об этом. Выдает следующее исключение:
org.hibernate.exception.SQLGrammarException: could not execute query; nested
exception is javax.persistence.PersistenceException:
org.hibernate.exception.SQLGrammarException: could not execute query
И Hibernate записывает следующую строку:
ERROR org.hibernate.util.JDBCExceptionReporter - You have an error in your SQL
syntax; check the manual that corresponds to your MySQL server version for the
right syntax to use near '' at line 1