Проблема Spring Data JPA (JPQL): использование функции TIMESTAMPDIFF в запросе JPA - PullRequest
0 голосов
/ 02 декабря 2018

У меня следующий запрос MySQL:

select p.name, sum(timestampdiff(MINUTE, r.start_time, r.end_time)) 
from ride r inner join person p on r.driver_id=p.id 
group by p.id

Я хочу написать это в JPA-запросе.Код ниже выдает исключение NullPointerException, оно не работает:

@RestResource
public interface SomeRepository extends CrudRepository<Ride, Long> {

@Query("SELECT new com.sample.dto.MyDTO(d.name, SUM(FUNCTION('TIMESTAMPDIFF', 'MINUTE', r.startTime, r.endTime))) " +
      "FROM Ride r JOIN r.driver d WHERE r.startTime BETWEEN ?1 AND ?2 " +
      "GROUP BY d.id" )
  List<MyDTO> findSomething(@Param("startTime") LocalDateTime startTime,
                                   @Param("endTime") LocalDateTime endTime);

}    

Если я использую функцию DATEDIFF, она работает.

FUNCTION('DATEDIFF', r.startTime, r.endTime)

Но мне нужна точная разница в минутах.TIMESTAMPDIFF удовлетворяет мои потребности.После неудачной попытки найти способ сделать это с помощью JPA я вернулся к собственному запросу, но это не очень хорошо.Любые альтернативы?

Я использую последнюю версию spring-data-jpa (2.1.3), hibernate-core: 5.3.7

public class Ride {
  @Column(name = "start_time")
  private LocalDateTime startTime;

  @Column(name = "end_time")
  private LocalDateTime endTime;

 }

Цель - найти полную разницу между startTime иendTime (в минутах).Есть ли способ сделать это со стандартным (портативным) JPA?

1 Ответ

0 голосов
/ 02 декабря 2018

На самом деле, в JPQL нет TIMESTAMPDIFF.

Ссылка: Эквивалент timestampdiff в JPQL (без использования критериев)

Итак, вы можете сделать то, что выможно использовать TIME_TO_SEC(TIMEDIFF(r.startTime, r.endTime)) / 60 вместо FUNCTION('TIMESTAMPDIFF', 'MINUTE', r.startTime, r.endTime)

...