[jboss-dev-forums] [Design of JBoss jBPM] - [sim] problems with hibernate queries and dates
camunda
do-not-reply at jboss.com
Tue Nov 13 11:57:26 EST 2007
Hi.
I stuck in two problems with hibernate queries today, I hope somebody has an answer to them!
I want to get the average (and standard derivation) of time between two process start events. For this I want to query the ProcessInstanceCreateLog.
First problem: I need to calculate the time in between. The "clean" way would be like this I think:
| select
| (select min(pl2.date) - pl.date
| from org.jbpm.graph.log.ProcessInstanceCreateLog pl2
| where pl2.date > pl.date)
| from org.jbpm.graph.log.ProcessInstanceCreateLog pl
| where pl.token.processInstance.processDefinition = :processDefinition
| and exists (select pl2.date
| from org.jbpm.graph.log.ProcessInstanceCreateLog pl2
| where pl2.date > pl.date)
|
Big problem here: How to make the date difference calculation db independant?
1.) The way with "-" seems not to work correct with mySQL in all cases. I got some wrong figures:
| 2007-11-13 17:21:00.0
| - 2007-11-13 17:20:59.0
| = 41
|
2.) TIMESTAMPDIFFERENCE(SECOND, time1, time2) results in a hibernate exception (even if it should be supported):
| Exception in thread "main" java.lang.NullPointerException
| at org.hibernate.dialect.Dialect$2.getReturnType(Dialect.java:85)
| at org.hibernate.hql.ast.util.SessionFactoryHelper.findFunctionReturnType(SessionFactoryHelper.java:382)
| at org.hibernate.hql.ast.tree.AggregateNode.getDataType(AggregateNode.java:21)
| at org.hibernate.hql.ast.tree.SelectClause.initializeExplicitSelectClause(SelectClause.java:143)
| at org.hibernate.hql.ast.HqlSqlWalker.useSelectClause(HqlSqlWalker.java:705)
| at org.hibernate.hql.ast.HqlSqlWalker.processQuery(HqlSqlWalker.java:529)
| at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:645)
| at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281)
| at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:229)
| at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:228)
| at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:160)
| at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)
|
3.) TIMEDIFF(time1, time2) results in a SQL exception when using MySQL:
java.sql.SQLException: Value '00:00:00 can not be represented as java.sql.Time
So how to do that in a database independant way?
The second problem is, that the figures I need are not calculated from the database. This can not be nested in the above statement (or I haven't figured it out how). So I thought about the following workaround, should work in real life, because process instance id's are ordered in order of creation date:
| select
| count(pl),
| avg(pl2.date - pl.date),
| min(pl2.date - pl.date),
| max(pl2.date - pl.date),
| stddev(pl2.date - pl.date)
| from org.jbpm.graph.log.ProcessInstanceCreateLog pl,
| org.jbpm.graph.log.ProcessInstanceCreateLog pl2
| where pl.token.processInstance.processDefinition = :processDefinition
| and pl2.token.processInstance.id = pl.token.processInstance.id + 1
| group by (pl.token.processInstance.processDefinition)
|
Does anybody sees upcoming problems with that query?
The last version is what I use for the moment, but it is still not really correct.
Any ideas to the date stuff?
Or do I have to go back to native queries? This would be a pain in the ass, because I have to provide SQL's for a bunch of databases... Hibernate seems to be a bit week at the point of date calculation... By the way, I found a Hibernate JIRA issue for it, but it seems not to be assigned :-(
http://opensource.atlassian.com/projects/hibernate/browse/HHH-2434
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4104230#4104230
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4104230
More information about the jboss-dev-forums
mailing list