【问题标题】:Join path impossible to solve无法解决的加入路径
【发布时间】:2021-02-24 18:20:38
【问题描述】:

我有以下 HQL 查询:

SELECT examen, OrganeSaisiMission
FROM com.an.eloi.model.domaine.amendement.Amendement as amendementOrigine 
join amendementOrigine.divisionExamen as divisionExamenOrigine 
join divisionExamenOrigine.examenOrigine as examen 
join examen.organeSaisi as organeSaisi 
join organeSaisi.texteDeLoi as texteDeLoi 
left join OrganeSaisiMission with OrganeSaisiMission.missionPlf.id = amendementOrigine.missionPlf.id and OrganeSaisiMission.organeSaisi.id = organeSaisi.id 
join organeSaisi.organe as organe
order by getTriBibard(texteDeLoi.texteBibard) asc, texteDeLoi.textePartie asc, examen.examenSecondeDeliberation asc

我得到一个错误:

2020-11-12 18:32:10,603 ERROR [http-bio-8080-exec-1] -  Path expected for join! - at org.hibernate.hql.PARSER(reportError:56)
2020-11-12 18:32:10,607 ERROR [http-bio-8080-exec-1] - [Ljava.lang.StackTraceElement;@ad757a9 - at java.lang.Object(error:46)
java.lang.NullPointerException
    at org.hibernate.hql.ast.util.SessionFactoryHelper.findSQLFunction(SessionFactoryHelper.java:364)
    at org.hibernate.hql.ast.tree.IdentNode.getDataType(IdentNode.java:293)
    at org.hibernate.hql.ast.tree.SelectClause.initializeExplicitSelectClause(SelectClause.java:154)
    at org.hibernate.hql.ast.HqlSqlWalker.useSelectClause(HqlSqlWalker.java:857)
    at org.hibernate.hql.ast.HqlSqlWalker.processQuery(HqlSqlWalker.java:645)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:685)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:301)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:244)
    at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:256)
    at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:187)
    at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:138)
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
    at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:124)
    at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
    at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
    at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1770)
    at com.an.eloi.model.dao.examen.ExamenDAO.findExamensForMenuItem(ExamenDAO.java:161)
    at com.an.eloi.model.domaine.examen.Examen.findExamensForMenuItem(Examen.java:82)
    at com.an.eloi.service.transactionnel.grilleV2.moteur.Regles.checkAmendementsRedeposables(Regles.java:658)
    at com.an.eloi.service.transactionnel.grilleV2.moteur.Regles.processItemBoutonRedeposer(Regles.java:567)
    at com.an.eloi.service.transactionnel.grilleV2.moteur.Regles.executeReglesSelect(Regles.java:1222)
    at com.an.eloi.service.transactionnel.grilleV2.moteur.MoteurReglesMenuBarre.executeSelect(MoteurReglesMenuBarre.java:1222)
    at com.an.eloi.service.transactionnel.grilleV2.etat.SelectState.genereBarMenu(SelectState.java:63)
    at com.an.eloi.service.transactionnel.grilleV2.MenuService.executerBarreMenuService(MenuService.java:639)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
    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$1.proceedWithInvocation(TransactionInterceptor.java:96)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:91)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
    at com.sun.proxy.$Proxy99.executerBarreMenuService(Unknown Source)
    at com.an.eloi.facade.grilleV2.GrilleSimpleFacade.executerBarreMenuService(GrilleSimpleFacade.java:181)
    at com.an.eloi.web.controller.barreoutils.BarreOutilsController.loadBarreMenu(BarreOutilsController.java:101)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:743)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:672)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:82)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:919)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:851)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:844)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at com.an.eloi.common.EloiActionFilter.doHttpFilter(EloiActionFilter.java:111)
    at com.an.eloi.common.EloiActionFilter.doHttpFilterSynchronizedBySession(EloiActionFilter.java:159)
    at com.an.eloi.common.EloiActionFilter.doFilter(EloiActionFilter.java:168)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at com.an.fwk.core.web.filter.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:84)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

显然,Hibernate 无法连接 OrganeSaisiMission 和其他表。怎么解决?

编辑:这里有 3 个可能很重要的 Hibernate 映射文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.an.eloi.model.domaine.missionPlf.MissionPlf" table="mission_plf">
        <id name="id" type="java.lang.Long">
            <column name="MISSION_PLF_ID" />
            <generator class="identity" />
        </id>
        <many-to-one name="divisionDeLoi" class="com.an.eloi.model.domaine.divisionDeLoi.DivisionDeLoi" fetch="select">
            <column name="DIVISIONDELOI_ID" not-null="true" />
        </many-to-one>
        <property name="missionPlfLibdef" type="java.lang.String">
            <column name="MISSION_PLF_INTITULE" length="1024" />
        </property>
        <property name="missionPlfEtat" type="java.lang.String">
            <column name="MISSION_PLF_ETAT" length="1024" />
        </property>
        <property name="missionPlfIntituleEtat" type="java.lang.String">
            <column name="MISSION_PLF_INTITULE_ETAT" length="1024" />
        </property> 
         <property name="missionPlfOrdreEtat" type="java.lang.Integer">
            <column name="MISSION_PLF_ORDRE_ETAT" length="10" />
        </property>
        <property name="missionPlfCode" type="java.lang.String">
            <column name="MISSION_PLF_CODE" length="1024" />
        </property> 
        <property name="missionPlfOrdre" type="java.lang.Integer">
            <column name="MISSION_PLF_ORDRE" length="10" />
        </property>
        <property name="missionPlfLigne" type="java.lang.String">
            <column name="MISSION_PLF_LIGNE" length="1024" />
        </property>              
        <property name="missionPlfIntituleTableau" type="java.lang.String">
            <column name="MISSION_PLF_INTITULE_TABLEAU" length="1024" />
        </property>                
        <property name="missionPlfOrdreTableau" type="java.lang.Integer">
            <column name="MISSION_PLF_ORDRE_TABLEAU" length="10" />
        </property>

        <set name="amendements" inverse="true">
            <key>
                <column name="MISSION_ID" />
            </key>
            <one-to-many class="com.an.eloi.model.domaine.amendement.Amendement" />
        </set>
        <set name="programmePlfs" inverse="true">
            <key>
                <column name="MISSION_PLF_ID" not-null="true" />
            </key>
            <one-to-many class="com.an.eloi.model.domaine.programmePlf.ProgrammePlf" />
        </set>

        <set name="organesaisimissions" table="organe_saisi_mission" inverse="true" cascade="save-update" lazy="true" fetch="select">
            <key>
                <column name="MISSION_PLF_ID" not-null="true" />
            </key>
            <one-to-many class="com.an.eloi.model.domaine.organesaisimission.OrganeSaisiMission" />
        </set>
      </class>
</hibernate-mapping>

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.an.eloi.model.domaine.organesaisi.OrganeSaisi" table="organe_saisi">
        <id name="id" type="java.lang.Long">
            <column name="ORGANE_SAISI_ID" />
            <generator class="identity" />
        </id>
        <many-to-one name="organe" class="com.an.eloi.model.domaine.organe.Organe" fetch="select">
            <column name="ORGANE_ID" not-null="true" />
        </many-to-one>
        <many-to-one name="texteDeLoi" class="com.an.eloi.model.domaine.texteDeLoi.TexteDeLoi" fetch="select">
            <column name="TEXTEDELOI_ID" not-null="true" />
        </many-to-one>
        <property name="organeSaisiTypeDeSaisie" type="java.lang.String">
            <column name="ORGANE_SAISI_TYPE_DE_SAISIE" length="100" />
        </property>
        <property name="organeSaisiLegisId" type="java.lang.String">
            <column name="ORGANE_SAISI_LEGIS_ID" not-null="false"/>
        </property>
        <property name="saisieDebut" type="java.util.Date">
            <column name="SAISIE_DEBUT" not-null="false"/>
        </property>
        <property name="saisieFin" type="java.util.Date">
            <column name="SAISIE_FIN" not-null="false"/>
        </property>

        <set name="organesaisimissions" table="organe_saisi_mission" inverse="true" cascade="save-update" lazy="true" fetch="select">
            <key>
                <column name="ORGANE_SAISI_ID" not-null="true" />
            </key>
            <one-to-many class="com.an.eloi.model.domaine.organesaisimission.OrganeSaisiMission" />
        </set>

    </class>
</hibernate-mapping>

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">


<hibernate-mapping>
    <class name="com.an.eloi.model.domaine.organesaisimission.OrganeSaisiMission" table="organe_saisi_mission">
        <id name="id" type="java.lang.Long">
            <column name="ORGANE_SAISI_MISSION_ID" />
            <generator class="identity" />
        </id>
        <many-to-one name="organeSaisi" class="com.an.eloi.model.domaine.organesaisi.OrganeSaisi" fetch="select">
            <column name="ORGANE_SAISI_ID" not-null="true" />
        </many-to-one>
        <many-to-one name="missionPlf" class="com.an.eloi.model.domaine.missionPlf.MissionPlf" fetch="select">
            <column name="MISSION_PLF_ID" not-null="true" />
        </many-to-one>
        <property name="missionOrdre" type="java.lang.Integer">
            <column name="MISSION_ORDRE" />
        </property>
        <property name="delaiDepotMission" type="java.util.Date">
            <column name="DELAI_DEPOT_MISSION" length="10" />
        </property>
        <property name="diffusion" type="java.lang.Byte">
            <column name="DIFFUSION" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

在第2个中,我加了organesaisimissions Set,没有用。无论有没有它们,我都会遇到同样的错误。

【问题讨论】:

  • 要重现您的问题,我们应该知道您的实体映射的相关部分。
  • 将所有连接更改为显式连接
  • @Conrad 我不是所有的加入都是明确的吗?
  • @SternK 我编辑了我的问题以添加映射的实体。
  • @AlexisDufrenoy 我在提供的实体中看不到com.an.eloi.model.domaine.amendement.Amendement 实体。您能否也将您的查询简化到重现您的问题的最低限度。如果您知道order by 部分和getTriBibard 函数使用与问题无关,只需将其删除。

标签: java hibernate join hql


【解决方案1】:

当你想引用某个连接时,你必须使用别名。除此之外,异常表明您使用的功能未映射到方言中。对于此类函数,您需要使用 JPA 函数调用语法。试试这个:

SELECT examen, m
FROM com.an.eloi.model.domaine.amendement.Amendement as amendementOrigine 
join amendementOrigine.divisionExamen as divisionExamenOrigine 
join divisionExamenOrigine.examenOrigine as examen 
join examen.organeSaisi as organeSaisi 
join organeSaisi.texteDeLoi as texteDeLoi 
left join OrganeSaisiMission m with m.missionPlf.id = amendementOrigine.missionPlf.id and m.organeSaisi.id = organeSaisi.id 
join organeSaisi.organe as organe
order by FUNCTION('getTriBibard', texteDeLoi.texteBibard) asc, texteDeLoi.textePartie asc, examen.examenSecondeDeliberation asc

【讨论】:

  • 我正在修改的查询实际上已经成功使用该函数,所以我怀疑这是错误的原因。
  • 根据您发布的堆栈跟踪,您显然在 select 子句中使用了方言未知的函数。您的问题的解决方案与我发布的答案类似。
猜你喜欢
  • 2018-10-08
  • 1970-01-01
  • 1970-01-01
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 2019-04-09
相关资源
最近更新 更多