将JDBCTemplate用于varchar值的总和

时间:2018-09-25 15:39:49

标签: mysql spring-data-jpa jdbctemplate

问候。

我有一个MySQL表Time_worked,其中一个Time_worked列如下:

| TIME_WORKED                 | varchar(500) | YES  |     | NULL    |       |

我正在尝试使用JDBCTemplate在Spring应用程序中找到sum(Time_Worked):

String totalEffortQuery = "SELECT sum(TIME_WORKED) FROM time_worked WHERE USER = ? and UPDATED>= now() - INTERVAL 1 DAY";
        Long totalEffortSeconds = jdbcTemplate.queryForObject(
                totalEffortQuery, new Object[] { assignedTo }, Long.class);

但是totalEffortSeconds始终为NULL值。

但是当我按如下所示直接在数据库中运行此查询时,它将返回结果:

SELECT sum(TIME_WORKED) FROM time_worked WHERE USER = 'Vishwanath Krishna Bhat' and UPDATED>= now() - INTERVAL 1 DAY;
+------------------+
| sum(TIME_WORKED) |
+------------------+
|            43200 |
+------------------+
1 row in set (0.02 sec)

我在某个地方无法读取SUM时读取了它,但是当我直接在数据库中直接使用它时,它确实可以工作。

请注意,我在Java代码中传递了正确的USER值,这不是问题。

有人可以帮我吗?

关于, 毗湿婆

1 个答案:

答案 0 :(得分:0)

您可以将varchar值强制转换为UNSIGNED。

修改后的查询将为

String totalEffortQuery = "SELECT sum(CAST(TIME_WORKED AS UNSIGNED)) FROM time_worked WHERE USER = ? and UPDATED>= now() - INTERVAL 1 DAY";
        Long totalEffortSeconds = jdbcTemplate.queryForObject(
                totalEffortQuery, new Object[] { assignedTo }, Long.class)

但这不是正确的方法,因为这会消耗大量杯子资源,最好将列转换为数值数据类型,如果不可能的话,请添加具有数值数据类型的另一列,并在插入和更新时添加触发器以存储该列中的值,以便您可以执行此操作。