Spring / H2 / Hibernate FORMATDATETIME "неожиданный токен: 'yyyy.MM.dd'" - PullRequest
0 голосов
/ 26 апреля 2018

У меня весна с Hibernate и H2. Все работает отлично, кроме одного из моих пользовательских запросов:

Моя сущность:

@Entity
public class Match {

    @Id
    @GeneratedValue( strategy = GenerationType.AUTO )
    private Long id;

    private Date started;

    private Long time;

    /* Getters and setters here */
}

Мой репозиторий:

@Repository
public interface MatchRepository extends CrudRepository<Match, Long> {

    @Query("SELECT IFNULL(sum(m.time), 0) FROM Match m where m.time >= 180000 AND m.time <= 1200000")
    long getPlayingTimeTotal();

    @Query("select count(*) from (select FORMATDATETIME(m.started, 'yyyy.MM.dd') from Match m where m.time >= 180000 AND m.time <= 1200000 GROUP BY FORMATDATETIME(m.started, 'yyyy.MM.dd'))")
    long getNumberOfDays();
}

Первый запрос для метода getPlayingTimeTotal работает просто отлично, но для второго я получаю ошибки:

Я получаю ошибки:

line 1:22: unexpected token: (

А также позже:

line 1:56: unexpected token: 'yyyy.MM.dd'

Когда я проверяю запрос в своем инструменте БД (я использую SQuirreL SQL ), тогда все работает просто отлично.

Как исправить мой запрос?

1 Ответ

0 голосов
/ 26 апреля 2018

Если вы не укажете, что это собственные запросы, вы должны использовать синтаксис JPQL, например. count(m) вместо count(*).

Если вам нужен собственный SQL, вам нужно сделать следующее:

@Query(nativeQuery = true,
             value = "SELECT IFNULL(sum(m.time), 0) FROM Match m " + 
                     "where m.time >= 180000 AND m.time <= 1200000")
long getPlayingTimeTotal();

@Query(nativeQuery = true, 
             value = "select count(*) from (" + 
                       "select FORMATDATETIME(m.started, 'yyyy.MM.dd') " + 
                       "from Match m where m.time >= 180000 AND m.time <= 1200000 " + 
                       "GROUP BY FORMATDATETIME(m.started, 'yyyy.MM.dd'))")
long getNumberOfDays();
...