2010-12-09 96 views
2

我是Hibernate的新手。我正在使用JSF,Spring和Hibernate創建一個Web應用程序。我想實現從使用用戶過濾器生成該查詢休眠在Hibernate中執行mysql查詢作爲本機查詢

select * from (Select DATE_FORMAT(a.call_offered_time,'%d %b %Y %k:%i:%s') As 'call_date', a.caller_id as 'Caller', DATE_FORMAT(a.call_offered_time,'%d %b %Y %k:%i:%s') as 'Call Connected', DATE_FORMAT(a.call_disconnect_time,'%d %b %Y %k:%i:%s') as 'Call Disconnected',a.channel_no as 'Channel', a.call_status as 'Call Status', (Case When a.call_routed_to_agent=Null or a.call_routed_to_agent='' then 'IVRS' Else call_routed_to_agent End) as 'Call Routed To', b.ddi,TIMESTAMPDIFF(SECOND,a.call_offered_time,a.call_disconnect_time) as 'Duration'from CallDetail a,ddi_details b Where a.call_reference_no =b.call_reference_no and a.call_offered_time Between '2006-01-01 00:00:00' And '2010-11-20 23:59:00') as t order by STR_TO_DATE(t.call_date,'%d %b %Y %k:%i:%s') 

爲此,我嘗試下面的代碼

Session session = null; 
    // This step will read hibernate.cfg.xml and prepare hibernate for use 
    SessionFactory sessionFactory = this.getSessionFactory(); 

    session =sessionFactory.openSession(); 



    //Create Select Clause HQL 
    String SQL_QUERY ="select * from (Select DATE_FORMAT(a.call_offered_time,'%d %b %Y %k:%i:%s') As 'call_date', " + 
         "a.caller_id as 'Caller', DATE_FORMAT(a.call_offered_time,'%d %b %Y %k:%i:%s') as " + 
         "'Call Connected', DATE_FORMAT(a.call_disconnect_time,'%d %b %Y %k:%i:%s') as " + 
         "'Call Disconnected',a.channel_no as 'Channel', a.call_status as 'Call Status', " + 
         "(Case When a.call_routed_to_agent=Null or a.call_routed_to_agent='' then 'IVRS' " + 
         "Else call_routed_to_agent End) as 'Call Routed To', b.ddi," + 
         "TIMESTAMPDIFF(SECOND,a.call_offered_time,a.call_disconnect_time) as " + 
         "'Duration'from CallDetail a,iss_master.ddi_details b Where " + 
         "a.call_reference_no =b.call_reference_no and a.call_offered_time Between " + 
         "'2006-01-01 00:00:00' And '2010-11-20 23:59:00') as t order by STR_TO_DATE(t.call_date,'%d %b %Y %k:%i:%s')"; 

    System.out.println(SQL_QUERY); 

    Query query = session.createSQLQuery(SQL_QUERY).addEntity(InboundCallDetail.class); 

    List result = query.list(); 

當我運行這段代碼,我得到以下錯誤

org.hibernate.MappingException: Unknown entity: com.address.InboundCallDetail 
at org.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:580) 
at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.getSQLLoadable(SQLQueryReturnProcessor.java:335) 
at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.processRootReturn(SQLQueryReturnProcessor.java:376) 
at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.processReturn(SQLQueryReturnProcessor.java:355) 
at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.process(SQLQueryReturnProcessor.java:171) 
at org.hibernate.loader.custom.sql.SQLCustomQuery.<init>(SQLCustomQuery.java:87) 
at org.hibernate.engine.query.NativeSQLQueryPlan.<init>(NativeSQLQueryPlan.java:67) 
at org.hibernate.engine.query.QueryPlanCache.getNativeSQLQueryPlan(QueryPlanCache.java:136) 
at org.hibernate.impl.AbstractSessionImpl.getNativeSQLQueryPlan(AbstractSessionImpl.java:160) 
at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165) 
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:175) 
at com.address.AddressDAOImpl.getDetails(AddressDAOImpl.java:102) 
at com.address.AddressBean.getDetail(AddressBean.java:46) 
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 javax.el.BeanELResolver.getValue(BeanELResolver.java:62) 
at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54) 
at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:72) 
at org.apache.el.parser.AstValue.getValue(AstValue.java:123) 
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186) 
at com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:71) 
at javax.faces.component.UIData.getValue(UIData.java:614) 
at javax.faces.component.UIData.getDataModel(UIData.java:1145) 
at javax.faces.component.UIData.setRowIndex(UIData.java:451) 
at com.sun.faces.renderkit.html_basic.TableRenderer.encodeBegin(TableRenderer.java:77) 
at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:813) 
at javax.faces.component.UIData.encodeBegin(UIData.java:983) 
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:928) 
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:933) 
at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:592) 
at org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:100) 
at org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:176) 
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:110) 
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100) 
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) 
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:266) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178) 
at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290) 
at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388) 
at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
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:127) 
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:298) 
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
at java.lang.Thread.run(Thread.java:619) 

請糾正我的錯誤或建議任何替代方法。

由於提前,

P.S之所以如此是由通過過濾器的用戶產生在查詢中的「地點」狀況的報告應用程序。

更新 對不起,爲時已晚! 我公司自創建使用Spring和Hibernate我沒有創建休眠-config.xml文件,而不是我陳設應用context.xml中的細節應用

我的應用程序context.xml文件是

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:aop="http://www.springframework.org/schema/aop" 
xmlns:tx="http://www.springframework.org/schema/tx" 
xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> 


<!-- DataSource Definition --> 
<bean id="dataSource" 
    class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close"> 
    <!-- MySQL Database --> 
    <property name="driverClassName"> 
     <value>com.mysql.jdbc.Driver</value> 
    </property> 
    <property name="url"> 
     <value>jdbc:mysql://localhost:3306/spring_hibernate?characterEncoding=UTF-8</value> 
    </property> 
    <property name="username"> 
     <value>root</value> 
    </property> 
    <property name="password"> 
     <value>sa</value> 
    </property> 
</bean> 

<!-- Hibernate SessionFactory Definition --> 
<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="mappingResources"> 
     <list> 
      <value> 
       com/address/Address.hbm.xml 
      </value>     
     </list> 
    </property> 

    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect"> 
       org.hibernate.dialect.MySQLDialect 
      </prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.hbm2ddl.auto">update</prop> 
      <prop key="hibernate.cglib.use_reflection_optimizer"> 
       true 
      </prop> 
      <prop key="hibernate.cache.provider_class"> 
       org.hibernate.cache.HashtableCacheProvider 
      </prop> 
      <prop key="hibernate.connection.useUnicode">true</prop> 
      <prop key="hibernate.connection.characterEncoding">UTF-8</prop> 
     </props> 
    </property> 

    <property name="dataSource"> 
     <ref bean="dataSource" /> 
    </property> 
</bean> 

<!-- Spring Data Access Exception Translator Definition --> 
<bean id="jdbcExceptionTranslator" 
    class="org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator"> 
    <property name="dataSource"> 
     <ref bean="dataSource" /> 
    </property> 
</bean> 

<!-- Hibernate Template Definition --> 
<bean id="hibernateTemplate" 
    class="org.springframework.orm.hibernate3.HibernateTemplate"> 
    <property name="sessionFactory"> 
     <ref bean="sessionFactory" /> 
    </property> 
    <property name="jdbcExceptionTranslator"> 
     <ref bean="jdbcExceptionTranslator" /> 
    </property> 
</bean> 



<bean id="dao" class="com.address.AddressDAOImpl"> 
<property name="hibernateTemplate"> 
     <ref bean="hibernateTemplate" /> 
    </property>     
</bean> 
<bean id="addressBean" 
    class="com.address.AddressBean"> 
    <property name="dao"> 
     <ref local="dao" /> 
    </property>   
</bean> 
<!-- ========================= Start of SERVICE DEFINITIONS ========================= 
--> 

<!-- Hibernate Transaction Manager Definition --> 
<bean id="transactionManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory"> 
     <ref local="sessionFactory" /> 
    </property> 
</bean> 

由於@Shervin建議我嘗試createNativeSQL(),我得到了以下錯誤

Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.address.AddressDAOImpl]: Constructor threw exception; nested exception is javax.persistence.PersistenceException: org.hibernate.HibernateException: Hibernate Dialect must be explicitly set 
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:115) 
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:61) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:877) 
... 31 more 

Caused by: javax.persistence.PersistenceException: org.hibernate.HibernateException: Hibernate Dialect must be explicitly set 
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:698) 
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:121) 
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:51) 
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:33) 
at com.address.AddressDAOImpl.<init>(AddressDAOImpl.java:19) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:100) 
... 33 more 

Caused by: org.hibernate.HibernateException: Hibernate Dialect must be explicitly set 
at org.hibernate.dialect.DialectFactory.determineDialect(DialectFactory.java:80) 
at org.hibernate.dialect.DialectFactory.buildDialect(DialectFactory.java:62) 
at org.hibernate.cfg.SettingsFactory.determineDialect(SettingsFactory.java:460) 
at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:155) 
at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2101) 
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1325) 
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:691) 
... 42 more 

我的更新Java代碼爲FO llows

@PersistenceContext private EntityManager em; 
EntityManagerFactory emf = Persistence.createEntityManagerFactory("myapp"); 

em = emf.createEntityManager(); 
Query query = em.createNativeQuery(SQL_QUERY); 

請糾正我的問題。感謝您的更新!

更新

我試圖通過@ckuetbach的建議和我的應用程序context.xml文件添加

<value> 
     com/address/InboundCallDetail.hbm.xml 
    </value> 

現在我得到這個錯誤

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is org.hibernate.MappingException: column attribute may not be used together with <column> subelement 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1337) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409) 
at java.security.AccessController.doPrivileged(Native Method) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:221) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:423) 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:729) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:381) 
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255) 
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199) 
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45) 
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3972) 
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4467) 
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) 
at org.apache.catalina.core.StandardHost.start(StandardHost.java:785) 
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) 
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443) 
at org.apache.catalina.core.StandardService.start(StandardService.java:519) 
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710) 
at org.apache.catalina.startup.Catalina.start(Catalina.java:581) 
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.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289) 
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414) 
Caused by: org.hibernate.MappingException: column attribute may not be used together with <column> subelement 
at org.hibernate.cfg.HbmBinder.bindColumns(HbmBinder.java:1075) 
at org.hibernate.cfg.HbmBinder.bindColumnsOrFormula(HbmBinder.java:1547) 
at org.hibernate.cfg.HbmBinder.bindSimpleValue(HbmBinder.java:1143) 
at org.hibernate.cfg.HbmBinder.createClassProperties(HbmBinder.java:2102) 
at org.hibernate.cfg.HbmBinder.createClassProperties(HbmBinder.java:2060) 
at org.hibernate.cfg.HbmBinder.bindRootPersistentClassCommonValues(HbmBinder.java:381) 
at org.hibernate.cfg.HbmBinder.bindRootClass(HbmBinder.java:295) 
at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:166) 
at org.hibernate.cfg.Configuration.add(Configuration.java:702) 
at org.hibernate.cfg.Configuration.addInputStream(Configuration.java:537) 
at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:631) 
at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1368) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1334) 
... 30 more 

請糾正我的錯誤!

+0

例外`未知實體:com.address.InboundCallDetail`似乎是休眠的錯誤配置的結果。你是否將該實體包含到Hibernate配置中?在應用程序服務器中,實體將由容器找到,但不是在獨立運行應用程序或作爲junit-test時才能找到。 請張貼您的`hibernate.cfg.xml`。 – 2010-12-09 08:41:19

+0

@ckuetbach:對不起,遲到了。我發佈了我的application-context.xml。這夠了嗎? – mvg 2010-12-09 12:16:43

回答

6

如果你想執行MySQL查詢在休眠本地查詢,你可以使用createNativeQuery()

+0

對不起,遲到了。其實我試圖實施你的建議。 Plz檢查我的更新! – mvg 2010-12-09 12:17:29

1

我想你錯過了包括映射到你的實體。您必須爲您的所有實體創建和添加映射文件。

<property name="mappingResources"> 
    <list> 
     <value> 
      com/address/Address.hbm.xml 
     </value>     
     <value> 
      com/address/InboundCallDetail.hbm.xml 
     </value>  
    </list> 
</property> 

第二個問題似乎是,你沒有設置休眠方言Hibernate Dialect must be explicitly