HQL查询PostgreSQL时Time without time zone字段转String方法咨询
解决方案
方案1:HQL层直接格式化(推荐,兼容现有写法)
直接对rf.Duration字段也使用to_char函数指定格式即可,你使用的数据库time without time zone类型原生支持该函数格式化,修改后的查询语句如下:
String queryText = "select new PackageName.MyClass(rf.Name, to_char(rf.StartDateTime,'YYYY/MM/DD HH24:MI:SS'), to_char(rf.Duration,'HH24:MI:SS')) from RecordFile as rf";
to_char指定HH24:MI:SS格式符后,输出结果就是和库中展示一致的00:05:08格式字符串,完全匹配构造函数的String类型参数要求,不需要修改其他代码逻辑。
方案2:Java层手动转换(兜底方案)
如果你的Hibernate方言不支持在HQL中直接对Time类型使用to_char,可以先查询原始类型结果,再手动转换构造实例:
try (Session context = HibernateUtil.getLocalSessionFactory().openSession()) { String queryText = "select rf.Name, to_char(rf.StartDateTime,'YYYY/MM/DD HH24:MI:SS'), rf.Duration from RecordFile as rf"; List<Object[]> rawList = context.createQuery(queryText).list(); List<MyClass> result = new ArrayList<>(); for (Object[] row : rawList) { String name = (String) row[0]; String startDateTime = (String) row[1]; // Time类型默认toString()输出就是HH24:MI:SS格式字符串 java.sql.Time durationTime = (java.sql.Time) row[2]; String durationStr = durationTime.toString(); result.add(new MyClass(name, startDateTime, durationStr)); } }
内容的提问来源于stack exchange,提问作者Esmaeil Chitgar
相关产品推荐
相关产品推荐

