2013-05-09 100 views
1
@SuppressWarnings("unchecked") 
public List<Object[]> findAdcampStatistics(Long adcampId, String startDate, String endDate, float costPerClick, String orderStatus){ 
    String sqlStr = 
      "SELECT adcamp_id, alternative_ids, click, orderCount, conversion, ((100*orderCount)/click) AS conversionRate, (click * " + (costPerClick != 0?costPerClick:0) + ") AS cost " + 
      "FROM (" + 
       "SELECT adcamp_id, alternative_ids, COUNT(*) AS click, " + 
        "SUM((" + 
         "SELECT COUNT(*) "+ 
         "FROM nc_order, nc_cart "+ 
         "WHERE nc_order.cart_id = nc_cart.id "+ 
          "AND nc_cart.adcamp_click_id = nc_adcamp_click.id "+ 
          (orderStatus != ""? "AND nc_order.order_status = '"+ orderStatus +"' " : " ")+ 
         ")) AS orderCount, "+ 
        "SUM((" + 
         "SELECT SUM(nc_payment_log.amount) "+ 
         "FROM nc_order, nc_cart, nc_payment_log "+ 
         "WHERE nc_order.payment_log_id = nc_payment_log.id "+ 
          "AND nc_order.cart_id = nc_cart.id "+ 
          "AND nc_cart.adcamp_click_id = nc_adcamp_click.id " + 
          (orderStatus != ""? "AND nc_order.order_status = '"+ orderStatus +"' " : " ") + 
         ")) AS conversion "+ 
       "FROM nc_adcamp_click "+ 
       "WHERE "+ 
        (adcampId!=0? "adcamp_id =" + adcampId.toString() + " AND ":" ") + 
        "date_clicked BETWEEN '" + startDate + "' AND '" + endDate + "' "+ 
       "GROUP BY alternative_ids "+ 
      ") AS temp"; 

    SQLQuery sqlQuery = getSQLQuery(sqlStr); 
    System.out.println("ADCAMP SQL ===============> " + sqlStr); 
    List<Object[]> result = new ArrayList<Object[]>(); 

    return sqlQuery.list(); 
} 

這裏是一個小複雜的SQL,我使用PARAMS創建它,當我上線sqlQuery.list();運行它,它給出了這樣的錯誤:休眠獲得SQL query.list():ArrayIndexOutOfBoundsException異常0

java.lang.ArrayIndexOutOfBoundsException: 0 
at org.hibernate.type.TypeHelper.disassemble(TypeHelper.java:146) 
at org.hibernate.cache.StandardQueryCache.put(StandardQueryCache.java:106) 
at org.hibernate.loader.Loader.putResultInQueryCache(Loader.java:2443) 
at org.hibernate.loader.Loader.listUsingQueryCache(Loader.java:2321) 
at org.hibernate.loader.Loader.list(Loader.java:2268) 
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:316) 
at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1842) 
at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165) 
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:157) 
at com.netasoft.commerce.framework.marketing.dao.AdCampDaoImpl.findAdcampStatistics(AdCampDaoImpl.java:71) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) 
at $Proxy96.findAdcampStatistics(Unknown Source) 
at com.netasoft.commerce.framework.marketing.service.MarketingServiceImpl.findAdcampStatistics(MarketingServiceImpl.java:71) 
at com.netasoft.commerce.framework.adminint.controller.ReportController.adcamp(ReportController.java:55) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:212) 
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126) 
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96) 
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617) 
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578) 
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:900) 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:827) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) 
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 

但是,當我在查詢瀏覽器中的SQL查詢上運行腳本它毫無例外地工作並返回結果。

SQL是:

SELECT adcamp_id, alternative_ids, click, orderCount, conversion, (100*orderCount)/click AS conversionRate, (click * 1.0) AS cost 
FROM (SELECT adcamp_id, alternative_ids, COUNT(*) AS click, 
    SUM((SELECT COUNT(*) FROM nc_order, nc_cart WHERE nc_order.cart_id = nc_cart.id AND nc_cart.adcamp_click_id = nc_adcamp_click.id AND nc_order.order_status = 'delivered' )) AS orderCount, 
    SUM((SELECT SUM(nc_payment_log.amount) FROM nc_order, nc_cart, nc_payment_log WHERE nc_order.payment_log_id = nc_payment_log.id AND nc_order.cart_id = nc_cart.id AND nc_cart.adcamp_click_id = nc_adcamp_click.id AND nc_order.order_status = 'delivered' )) AS conversion 
    FROM nc_adcamp_click 
    WHERE adcamp_id =1 AND date_clicked BETWEEN '2013-02-09' AND '2013-05-09' 
    GROUP BY alternative_ids 
) AS temp 
+2

您可以在該ArrayIndexOutOfBoundsException的堆棧跟蹤中編輯嗎? – 2013-05-09 12:46:07

回答

2

我覺得你的問題可能有一些與此有關:

https://hibernate.atlassian.net/browse/HHH-6681

很奇怪地看到在你的堆棧跟蹤StandardQueryCache此本機查詢。您是否明確啓用了此查詢的查詢緩存?如果是這樣,請嘗試不使用查詢緩存,因爲它看起來像hibernate有問題導致映射實體的類型來綁定緩存。

+0

是的,默認情況下,緩存對所有查詢都是有效的。實際上,這個項目有三維緩存。當我禁用查詢緩存這個查詢它的工作。 – efirat 2013-05-09 16:19:56