Hibernate + SQL Server - 将时间戳转换为日期错误

时间:2016-06-15 15:04:52

标签: java sql-server hibernate spring-boot spring-data

我在我的项目中使用Springboot 1.3.5.RELEASE,并使用SpringDataJpa 1.9.4.RELEASE,Hibernate 4.3.11.FINAL来访问MSSQL Server 2014.在我的application.properties中,我设置了最多最近的方言是org.hibernate.dialect.SQLServer2012Dialect,我使用手动导入的Microsoft JDBC驱动程序com.microsoft.sqlserver.jdbc.SQLServerDriver(sqljdbc4.jar)。

问题是,我想使用我的createdAt列检索一个简单的查询,该列是一个时间戳,可以转换为Date(YYYY-MM-DD)。所以我在我的交易实体中有以下命名的查询:

  SELECT new myproject.wrapper.TrendingChartData(cast(createdAt as date),
         liveVerifyCode, count(*)) 
    FROM Transaction t 
   WHERE t.bucket.id = :bucketId 
GROUP BY cast(createdAt as date), liveVerifyCode

但我的检索日期如下:

DATE      | Code | Count
2016-06-10|  2   | 1
2016-06-10|  1   | 1
2016-06-10|  2   | 1
2016-06-10|  1   | 1
2016-06-10|  2   | 1
2016-06-10|  2   | 1
2016-06-10|  1   | 1
2016-06-10|  1   | 1
2016-06-10|  1   | 1

所以它似乎正在投射结果,但它正在进行分组。我已经生成了一段SQL,我有:

  select cast(transactio0_.createdAt as datetime) as col_0_0_,
         transactio0_.liveVerifyCode as col_1_0_, 
         count(*) as col_2_0_ 
    from TransactionData transactio0_ 
   where transactio0_.bucket_id=? 
group by cast(transactio0_.createdAt as datetime), transactio0_.liveVerifyCode

因此出于某种原因投射日期时间而不是日期。如果运行相同的上述查询,但将关键字datetime更改为日期,则它在MSSQL中完美运行...看来这与Hibernate MSSQL方言有关。

你们有什么想法帮助我吗?

非常感谢!

2 个答案:

答案 0 :(得分:0)

对于可能遇到此问题的未来人员,我使用以下方法解决了这个问题:

SELECT new myproject.wrapper.TrendingChartData(
       year(t.createdAt), month(t.createdAt), day(t.createdAt),
       liveVerifyCode, count(*))  
  FROM Transaction t 
 WHERE t.bucket.id = :bucketId 
 GROUP BY year(t.createdAt), month(t.createdAt), day(t.createdAt), t.liveVerifyCode
 ORDER BY year(t.createdAt), month(t.createdAt), day(t.createdAt)

谢谢!

答案 1 :(得分:-1)

在 2021 年通过将 hibernate 方言从 org.hibernate.dialect.SQLServerDialect 更改为 org.hibernate.dialect.SQLServer2012Dialect 来解决该问题