我在我的项目中使用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方言有关。
你们有什么想法帮助我吗?
非常感谢!
答案 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 来解决该问题