У меня есть тип объекта с двумя датами: startDate и endDate:
import org.joda.time.DateTime;
@Entity
public class Thing {
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
private DateTime startDate;
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
private DateTime endtDate;
}
У меня есть репозиторий Spring Data-JPA (расширяет CrudRepository
) для этого типа сущности, и там мне нужен способ запроса всех Thing
, которые являются «активными», где «активный» определяется как
startDate ‹= now‹ = endDate
Я пробовал выполнить такой запрос JPQL, но он не дал ожидаемых результатов в некоторых наших тестах:
@Query("select t from Thing t where t.startDate <= CURRENT_TIMESTAMP and t.endDate >= CURRENT_TIMESTAMP")
public Iterable<Thing> findAllActive();
Я также попробовал запрос с соглашением о названии метода, который дает ожидаемые результаты, но это неудобно:
public Iterable<Thing> findByStartDateBeforeAndEndDateAfter(DateTime minStartDate, DateTime maxEndDate);
Я могу обернуть это своим @Service
лайком
public Iterable<Thing> getActiveThings() {
DateTime now = DateTime.now();
return repository.findByStartDateBeforeAndEndDateAfter(now, now);
}
Так что интерфейс сервиса чистый, но интерфейс репо уродлив и неудобен (на мой взгляд).
Есть ли лучший способ создать этот метод запроса репозитория с использованием JPA: лучший запрос на основе имени метода или явный запрос JPQL? Я бы предпочел не создавать вручную объект Query в коде (сейчас у меня даже нет конкретного класса для репозитория, только интерфейс), но если это лучший способ, я подумаю об этом.
CURRENT_TIMESTAMP
? - person TheKojuEffect   schedule 18.02.2014CURRENT_TIMESTAMP
- это встроенная функция в JPQL, которая возвращает текущую дату и время в базе данных. См. stackoverflow.com/a/1659088/639520 - person E-Riz   schedule 18.02.2014Date
по умолчанию, в отличие от указанного вами типа. Попробуйте использоватьjava.util.Date
, чтобы узнать, не вызывает ли@Type
проблемы. - person TheKojuEffect   schedule 18.02.2014