2014-10-30 77 views
1

我想计算一个实体的两个时间戳字段的时间差的平均值,实体具有start_date和finish_date属性。在SQL中,它是这样的:获得休眠的两个时间戳差异的平均值

SELECT SUM(FINISH_TIME - START_TIME)/COUNT(*) FROM PROCESS_EXECUTION_LOG WHERE FINISH_TIME IS NOT NULL 

当我尝试运行在休眠此为本地SQL:

Session session = sessionFactory.openSession(); 
SQLQuery sqlQuery = session 
      .createSQLQuery("SELECT SUM(FINISH_TIME - START_TIME)/COUNT(*) FROM PROCESS_EXECUTION_LOG WHERE FINISH_TIME IS NOT NULL"); 
sqlQuery.list(); 

它已抛出exeption:

org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111 
    at org.hibernate.dialect.TypeNames.get(TypeNames.java:76) 
    at org.hibernate.dialect.TypeNames.get(TypeNames.java:99) 
    at org.hibernate.dialect.Dialect.getHibernateTypeName(Dialect.java:579) 
    at org.hibernate.loader.custom.CustomLoader$Metadata.getHibernateType(CustomLoader.java:696) 
    at org.hibernate.loader.custom.CustomLoader$ScalarResultColumnProcessor.performDiscovery(CustomLoader.java:600) 
    at org.hibernate.loader.custom.CustomLoader.autoDiscoverTypes(CustomLoader.java:616) 
    at org.hibernate.loader.Loader.getResultSet(Loader.java:2039) 
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1832) 
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1811) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:899) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:341) 
    at org.hibernate.loader.Loader.doList(Loader.java:2516) 
    at org.hibernate.loader.Loader.doList(Loader.java:2502) 
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2332) 
    at org.hibernate.loader.Loader.list(Loader.java:2327) 
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:338) 
    at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:1783) 
    at org.hibernate.internal.AbstractSessionImpl.list(AbstractSessionImpl.java:231) 
    at org.hibernate.internal.SQLQueryImpl.list(SQLQueryImpl.java:157) 

它可能是非常微不足道的,但我找不到解决方案。如果有使用Hibernate API(限制,预测等)的解决方案,它将非常有用。

编辑:我刚刚意识到,postgresql返回INTERVAL数据类型,这是未知的JDBC。我认为唯一的解决方案是重写这个SQL,以毫秒为单位返回结果(如数字)。但是,我不知道如何?

回答

1

做这样

String sql = "SELECT SUM(FINISH_TIME - START_TIME)/COUNT(*) FROM PROCESS_EXECUTION_LOG WHERE FINISH_TIME IS NOT NULL"; 

Session session = sessionFactory.openSession(); 
SQLQuery sqlQuery = session 
      .createSQLQuery(sql); 
Long value = (Long)sqlQuery.uniqueResult(); 
+0

我仍然得到同样的exeption – 2014-10-30 13:06:36

相关问题