2015-09-07 67 views
0

根據我的設計,我創建了擴展同一個實體的實體。但有些實體具有其他屬性(列)。休眠從兩個實體擴展同一個實體的查詢

我的問題如下:當我爲每個實體調用查詢時沒有問題。但是當在一個查詢中調用更多表時,會遇到問題。

此查詢的工作很好:QueryA

Query query = session.getCurrentSession().createQuery("from ExtendedA where title like :title order by pubdate desc "); 

但這種失敗! QueryB

Query query = session.getCurrentSession().createQuery("from ExtendedA, ExtendedB where title like :title order by pubdate desc "); 

是沒有問題的,如果我打電話只是這一點; QueryC

Query query = session.getCurrentSession().createQuery("from ExtendedA, ExtendedB"); 

問題是使用排序或(where-)子句時。

ExtendedA和ExtendedB繼承自classA,它具有pubdate, title和其他屬性。在這種情況下,每個類應該具有這些屬性。這些屬性(列)沒有問題,一個接一個地調用它們。

誰能幫我寫一個查詢像QueryB

感謝。

type Exception report 

message Request processing failed; nested exception is org.hibernate.exception.ConstraintViolationException: could not extract ResultSet 

description The server encountered an internal error that prevented it from fulfilling this request. 

exception 

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.exception.ConstraintViolationException: could not extract ResultSet 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:620) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    org.apache.logging.log4j.web.Log4jServletFilter.doFilter(Log4jServletFilter.java:71) 
root cause 

org.hibernate.exception.ConstraintViolationException: could not extract ResultSet 
    org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:72) 
    org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) 
    org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126) 
    org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112) 
    org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:91) 
    org.hibernate.loader.Loader.getResultSet(Loader.java:2066) 
    org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1863) 
    org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1839) 
    org.hibernate.loader.Loader.doQuery(Loader.java:910) 
    org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:355) 
    org.hibernate.loader.Loader.doList(Loader.java:2554) 
    org.hibernate.loader.Loader.listUsingQueryCache(Loader.java:2399) 
    org.hibernate.loader.Loader.list(Loader.java:2362) 
    org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:497) 
    org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:387) 
    org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:236) 
    org.hibernate.internal.SessionImpl.list(SessionImpl.java:1264) 
    org.hibernate.internal.QueryImpl.list(QueryImpl.java:103) 
    project.data.dao.general.top.AnnouncementDAOImpl.getAll(AnnouncementDAOImpl.java:47) 
    project.data.service.general.top.AnnouncementServiceImpl.getAll(AnnouncementServiceImpl.java:51) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    java.lang.reflect.Method.invoke(Method.java:497) 
    org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
    org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98) 
    org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:266) 
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) 
    com.sun.proxy.$Proxy47.getAll(Unknown Source) 
    project.endpoint.general.top.AnnouncementEP.getAll(AnnouncementEP.java:35) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    java.lang.reflect.Method.invoke(Method.java:497) 
    org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215) 
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) 
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:781) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:721) 
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:620) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    org.apache.logging.log4j.web.Log4jServletFilter.doFilter(Log4jServletFilter.java:71) 
root cause 

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'pubdate' in order clause is ambiguous 
    sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
    sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    java.lang.reflect.Constructor.newInstance(Constructor.java:422) 
    com.mysql.jdbc.Util.handleNewInstance(Util.java:406) 
    com.mysql.jdbc.Util.getInstance(Util.java:381) 
    com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015) 
    com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) 
    com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491) 
    com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423) 
    com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936) 
    com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060) 
    com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542) 
    com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734) 
    com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1885) 
    org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:93) 
    org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:82) 
    org.hibernate.loader.Loader.getResultSet(Loader.java:2066) 
    org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1863) 
    org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1839) 
    org.hibernate.loader.Loader.doQuery(Loader.java:910) 
    org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:355) 
    org.hibernate.loader.Loader.doList(Loader.java:2554) 
    org.hibernate.loader.Loader.listUsingQueryCache(Loader.java:2399) 
    org.hibernate.loader.Loader.list(Loader.java:2362) 
    org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:497) 
    org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:387) 
    org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:236) 
    org.hibernate.internal.SessionImpl.list(SessionImpl.java:1264) 
    org.hibernate.internal.QueryImpl.list(QueryImpl.java:103) 
    project.data.dao.general.top.AnnouncementDAOImpl.getAll(AnnouncementDAOImpl.java:47) 
    project.data.service.general.top.AnnouncementServiceImpl.getAll(AnnouncementServiceImpl.java:51) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    java.lang.reflect.Method.invoke(Method.java:497) 
    org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
    org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98) 
    org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:266) 
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) 
    com.sun.proxy.$Proxy47.getAll(Unknown Source) 
    project.endpoint.general.top.AnnouncementEP.getAll(AnnouncementEP.java:35) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    java.lang.reflect.Method.invoke(Method.java:497) 
    org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215) 
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) 
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:781) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:721) 
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:620) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    org.apache.logging.log4j.web.Log4jServletFilter.doFilter(Log4jServletFilter.java:71) 
+0

StackTrace好嗎?但我想你需要使用表別名。 – drgPP

+0

我增加了stacktrace – reigeki

回答

1

只要您使用具有相同屬性名稱的實體,則不清楚應使用哪個實體屬性。例如,您是通過ExtendedA.pubdate還是ExtendedB.pubdate訂購的?

您必須指定屬性和實體如何相互對應。像

Query query = session.getCurrentSession().createQuery("from ExtendedA as a, ExtendedB as b where a.title like :title and b.title like :title order by a.pubdate desc "); 
+0

有沒有一種方式,只是pubdate的順序。因爲它們都有 – reigeki

+0

從Hibernate的角度來看,你使用兩個不同的表,它們有兩組不同的列,但名稱相同。因此,您將有雙重計數的列,所以您必須按每個列進行排序。在你的情況下,最好將你的超類標記爲實體併爲子類創建JOINED繼承。在這種情況下,您將擁有存儲在超類表中的所有常用數據,因此您可以從中選擇/ orderby。然後,您可以使用內部聯接來加入ExtendedA,ExtendedB中的特定數據。 –