获得与hibernate的两个时间戳差异的平均值

时间:2014-10-30 11:55:52

标签: java sql hibernate native-sql

我想计算一个实体的两个时间戳字段的时间差的平均值,这样;实体有start_date和finish_date attibutes。在SQL中,它类似于以下内容:

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

当我尝试在hibernate中将其作为本机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();

它抛出了一个例外:

   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会返回对于JDBC未知的INTERVAL数据类型。我认为唯一的解决方案是重写这个以毫秒为单位返回结果的SQL(作为数字)。但是,我不知道怎么做?

1 个答案:

答案 0 :(得分: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();