Java 对于两个类/表之间的连接,正确的Hibernate查询语法是什么?

Java 对于两个类/表之间的连接,正确的Hibernate查询语法是什么?,java,hibernate,hql,Java,Hibernate,Hql,我已经做了几个小时,但没有成功。对于我从这里记录的其他事件或其他地方的示例中尝试的一切,HQL语法在我的方法中似乎总是错误的: Session session = sessionFactory.openSession(); try { Query query = session.createQuery("select p from Person p join p.books where p.personId = :personId").setParameter("

我已经做了几个小时,但没有成功。对于我从这里记录的其他事件或其他地方的示例中尝试的一切,HQL语法在我的方法中似乎总是错误的:

 Session session = sessionFactory.openSession();
    try { 


        Query query = session.createQuery("select p from Person p join p.books where p.personId = :personId").setParameter("personId", personId);

        List<Person> persons = query.list();    
        Person person = persons.get(0);
        Hibernate.initialize(person.getBooks());
        return person;
    }        
    finally {
        session.close();            
    }    
有人能告诉我哪里错了吗

如果有任何用途,Hibernate将返回:

select person0_.PERSON_ID as PERSON_I1_1_0_, book2_.BOOK_ID as BOOK_ID1_0_1_, person0_.ADDRESS as ADDRESS2_1_0_, person0_.EMAIL as EMAIL3_1_0_, person0_.NAME as NAME4_1_0_, person0_.TELEPHONE as TELEPHON5_1_0_, book2_.AUTHOR as AUTHOR2_0_1_, book2_.DESCRIPTION as DESCRIPT3_0_1_, book2_.ONLOAN as ONLOAN4_0_1_, book2_.person_Id as person_I6_0_1_, book2_.TITLE as TITLE5_0_1_, books1_.PERSON_PERSON_ID as PERSON_P1_1_0__, books1_.books_BOOK_ID as books_BO2_2_0__ from PERSON person0_ left outer join PERSON_BOOK books1_ on person0_.PERSON_ID=books1_.PERSON_PERSON_ID left outer join BOOK book2_ on books1_.books_BOOK_ID=book2_.BOOK_ID where person0_.PERSON_ID=?
使用如下查询:

Query query = session.createQuery("select from Person as p left join fetch p.books where p.personId = :personId").setParameter("personId", personId);
堆栈跟踪是:

Your page request has caused a QuerySyntaxException: unexpected token: from near line 1, column 8 [select from library.model.Person as p left join fetch p.books where p.personId = :personId] error:
org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:109) org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:304) org.hibernate.hql.internal.ast.QueryTranslatorImpl.docomFile(QueryTranslatorImpl.java:203) org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158) org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:126) org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:88) org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:190) org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301) org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236) org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1800) library.dao.PersonDAOImpl.get(PersonDAOImpl.java:57) library.service.PersonService.get(PersonService.java:32) library.service.PersonService$$FastClassBySpringCGLIB$$7dacb914.invoke() org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:711) org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:157) org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98) org.springframework.transaction.interceptor.TransactionSpectSupport.invokeWithinTransaction(TransactionSpectSupport.java:262) org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95) org.springframework.aop.framework.ReflectiveMethodInvocation.procement(ReflectiveMethodInvocation.java:179) org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:644) library.service.PersonService$$EnhancerBySpringCGLIB$$b855c56c.get() library.controller.PersonController.idValid(PersonController.java:112) library.controller.PersonController.getLogin(PersonController.java:80) sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:483) 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:749) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:690) org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852) javaservlet.http.HttpServlet.service(HttpServlet.java:621) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) javaservlet.http.HttpServlet.service(HttpServlet.java:722) org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498) org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562) org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394) org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243) org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188) org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) run(Thread.java:744)

用于急切加载链接的集合:

FROM Person as p LEFT JOIN FETCH p.books WHERE p.personId = :personId

如果您只是尝试在一个人内获取书籍,则不需要使用JOIN子句,只需加载Person对象将缓慢地获取他们的相关书籍,或者至少这是我通常的工作方式。不幸的是,每当我尝试从数据库中检索书籍之前,我都会收到一条与会话已关闭有关的消息。啊,这是因为它是惰性获取的,所以您需要将惰性获取更改为急切获取。懒洋洋地去拿我
Your page request has caused a QuerySyntaxException: unexpected token: from near line 1, column 8 [select from library.model.Person as p left join fetch p.books where p.personId = :personId] error:
 org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:91)
FROM Person as p LEFT JOIN FETCH p.books WHERE p.personId = :personId