首页 > 解决方案 > Spring/H2/Hibernate FORMATDATETIME“意外令牌:'yyyy.MM.dd'”

问题描述

我有 Hibernate 和 H2 的 Spring。一切正常,除了我的一个自定义查询:

我的实体:

@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)中检查查询时,一切正常。

如何修复我的查询?

标签: javasqlspringhibernateh2

解决方案


如果您未指定它们是本机查询,则应使用 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();

推荐阅读