java - 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)中检查查询时,一切正常。
如何修复我的查询?
解决方案
如果您未指定它们是本机查询,则应使用 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();
推荐阅读
- reactjs - 当图像显示在滚动反应时更改文本
- c# - 通用类型。没有装箱转换或类型参数转换
- firebird - 如何在Firebird系统表中查找名称以某个后缀结尾的所有表
- arcore - 如何在纵向或纵向中使用捏合手势专门缩放模型?
- javascript - 无法在 VueJS 中绑定填充高度属性
- html - 旧的 HTML/CSS 文件未在 GitHub 上使用 git push 进行更新
- php - 我做错了什么“滚动文本栏”
- node.js - 有没有办法知道通过 http 流式传输的文件有多大?
- xml-configuration - 在 ehcache 3.x 版本中指定磁盘路径的等效 xml 标记是什么
- jenkins - 詹金斯工作区什么时候得到保留?