I am trying to do the following the hibernate using the Cretiria.
SELECT COL1, YEAR(COL3), MONTH(COL3), COUNT(DISTINCT COL2)
FROM TABLE
WHERE YEAR(COL3) = 2008
GROUP BY COL1, YEAR(COL3), MONTH(COL3)
ORDER BY COL1
where COL3 is a timestamp column
Hibernate version:3.3.1
Mapping documents:
Code:
<hibernate-mapping package="com.amgen.edm.beans">
<class name="UserTracking" table="userTracking">
<id name="RowId" column="rowId" type="long" >
<generator class="identity"/>
</id>
<property name="UID" column="uid"/>
<property name="ActionID" column="actionID" type="int" />
<property name="EventTriggered" type="timestamp" column="event_ts"/>
</class>
</hibernate-mapping>
Code between sessionFactory.openSession() and session.close():
Code:
try{
session.beginTransaction();
Criteria criteria = session.createCriteria(UserTracking.class);
ProjectionList pl = Projections.projectionList();
//add the field name to the projection list
StringBuffer sql =new StringBuffer();
StringBuffer sqlgroup = new StringBuffer();
ArrayList<String> aliases = new ArrayList<String>();
ArrayList<Type> types = new ArrayList<Type>();
for(int i =0; i<sel.length; i++)
{
sql.append(sel[i]+"({alias}.event_ts) as "+sel[i]+"_ts,");
sqlgroup.append(sel[i]+"({alias}.event_ts),");
aliases.add(sel[i]+"_ts");
types.add(Hibernate.INTEGER);
}
for(int i=0; i<params.length; i+=2)
{
criteria.add(Restrictions.sqlRestriction(params[i]+"(event_ts)="+params[i+1]));
}
//sql to project, get ride of the last comma
sql.deleteCharAt(sql.length()-1);
sqlgroup.deleteCharAt(sqlgroup.length()-1);
//cast the aliases and type to the correct type
String[] al = (String[]) aliases.toArray(new String[aliases.size()]);
Type[] ty = (Type[]) types.toArray(new Type[types.size()]);
//add the group by clauses
pl.add(Projections.groupProperty("URL"));
pl.add(Projections.sqlGroupProjection(sql.toString(),
sqlgroup.toString(), al, ty));
criteria.setProjection(pl);
pl.add(Projections.countDistinct("Username"));
criteria.addOrder(Order.asc("URL"));
for(int i=0; i<sel.length; i++)
{
criteria.addOrder(Order.asc(sel[i]));
}
result = criteria.list();
Full stack trace of any exception that occurs:
org.hibernate.QueryException: could not resolve property: year of: com.amgen.edm.beans.UserTracking
at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:67)
at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:61)
at org.hibernate.persister.entity.AbstractEntityPersister.getSubclassPropertyTableNumber(AbstractEntityPersister.java:1402)
at org.hibernate.persister.entity.BasicEntityPropertyMapping.toColumns(BasicEntityPropertyMapping.java:54)
at org.hibernate.persister.entity.AbstractEntityPersister.toColumns(AbstractEntityPersister.java:1377)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumns(CriteriaQueryTranslator.java:457)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumnsUsingProjection(CriteriaQueryTranslator.java:417)
at org.hibernate.criterion.Order.toSqlString(Order.java:68)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getOrderBy(CriteriaQueryTranslator.java:371)
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:102)
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:82)
at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:91)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1577)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:306)
at com.amgen.edm.hibernate.dao.UserTrackingDAO.getTotalNumberOfUsers(Unknown Source)
at com.amgen.edm.charting.MonthlyChart.createDataSet(Unknown Source)
at org.apache.jsp.jsp.index_jsp._jspService(index_jsp.java:145)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)
Name and version of the database you are using:MSSQL version 2008The generated SQL (show_sql=true): None
CriteriaImpl(com.amgen.edm.beans.UserTracking:this[][year(event_ts)=2008][URL, year({alias}.event_ts) as year_ts,month({alias}.event_ts) as month_ts, distinct count(Username)])
Thanks,
[/code]