JPL спящий дата математика - PullRequest
0 голосов
/ 01 декабря 2011

Я нуб из 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

1 Ответ

0 голосов
/ 01 декабря 2011

Хотя я согласен, что математические функции даты в JPQL примитивны, эту проблему легко обойти, вычислив дату, соответствующую вашей «любой» задержке, и сравнив дату, сохраненную в базе данных, с этой вычисленной датой:

int daysToMaturation = 10;
Date maxDate = addDaysToCurrentDate(daysToMaturation);
String jpql = "select lease from Lease lease where lease.maturationDate <= :maxDate";
// ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...