2016-06-15 84 views
0

我在我的项目中使用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)。Hibernate + SQL Server - Cast Timestamp日期错误

问题是,我想检索一个简单的查询,使用我的createdAt列,这是一个时间戳,可以转换为日期(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 Dialect有关。

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

非常感谢!

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) 

谢谢:

回答

0

对于可能有这个问题今后的乡亲,我使用下面的方法解决了这个问题!