簡體   English   中英

LEFT JOIN中帶有-clause的Hql錯誤

[英]Hql error with-clause in LEFT JOIN

經過幾天的研究,我仍然沒有找到解決方案。

我有這個拋出querySyntaxException的HQL請求:

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: with-clause referenced two different from-clause elements [SELECT patDataset.patient.sId , patData ,proDataset.professional.sId, proData  FROM com.inovelan.cloud.persistence.server.entities.DataSet patDataset INNER JOIN patDataset.patient patient with patient. sId in (:patientSidList) LEFT JOIN patient.patientProfessionals ppRole with ppRole.id.roleCodingOidcodesystem= :codeSystem AND ppRole.id.roleCodingCode=:codingCode  LEFT JOIN ppRole.professional proRole  LEFT JOIN proRole.dataSet proDataset with proDataset.archive =:archive  LEFT JOIN proDataset.dataProfessionals proData with proData.itemDefinition.id.id in (:proItemDefs)  INNER JOIN patDataset.dataSetDefinition patDatasetDef with patDatasetDef.id.id in(:patDatasetDefIdList) INNER JOIN patDataset.dataPatients patData  LEFT JOIN patDataset.dataPatients data_patient_PAT_SEXE with ( data_patient_PAT_SEXE.itemDefinition.id.id=:data_patient_PAT_SEXE AND patDataset.dataSetDefinition.id.id ='DIRECTORY_PATIENT')  LEFT JOIN patDataset.dataPatients data_patient_PAT_NOM_NAISSANCE with ( data_patient_PAT_NOM_NAISSANCE.itemDefinition.id.id=:data_patient_PAT_NOM_NAISSANCE AND patDataset.dataSetDefinition.id.id ='DIRECTORY_PATIENT')  LEFT JOIN patDataset.dataPatients data_patient_PAT_PRENOM with ( data_patient_PAT_PRENOM.itemDefinition.id.id=:data_patient_PAT_PRENOM AND patDataset.dataSetDefinition.id.id ='DIRECTORY_PATIENT')  WHERE patDataset.archive=:archive  AND patient.active=:patientState  AND ( patDatasetDef.id.id =:dataset_def_pat_DIRECTORY_PATIENT AND patData.itemDefinition.id.id in (:itemdef_list_pat_DIRECTORY_PATIENT)  ) AND patDataset.date = (SELECT MAX(patDataset2.date) FROM com.inovelan.cloud.persistence.server.entities.DataSet patDataset2 WHERE patDataset2.dataSetDefinition.id.id = patDataset.dataSetDefinition.id.id AND patDataset2.patient.sId =  patDataset.patient.sId) ORDER BY (CASE WHEN data_patient_PAT_SEXE.stringValue IS NULL then 1 ELSE 0 END), data_patient_PAT_SEXE.stringValue ASC,(CASE WHEN data_patient_PAT_NOM_NAISSANCE.stringValue IS NULL then 1 ELSE 0 END), data_patient_PAT_NOM_NAISSANCE.stringValue ASC,(CASE WHEN data_patient_PAT_PRENOM.stringValue IS NULL then 1 ELSE 0 END), data_patient_PAT_PRENOM.stringValue ASC]
at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:91)
at org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:109)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:284)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:206)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:131)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:93)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:167)
at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301)
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236)
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1836)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:342)

我提取了請求以使其更容易理解,這種“左連接”的原因是對元數據進行排序(它並不總是添加到請求中):

SELECT patDataset.patient.sId,
   patData
FROM DataSet patDataset
INNER JOIN patDataset.patient patient
INNER JOIN patDataset.dataSetDefinition patDatasetDef WITH patDatasetDef.id.id IN(:patDatasetDefIdList)
LEFT JOIN patDataset.dataPatients data_patient_PAT_SEXE WITH (data_patient_PAT_SEXE.itemDefinition.id.id='SEXE'
                                                          AND patDatasetDef.id.id ='DIRECTORY_PATIENT')
WHERE patDataset.archive=:archive
AND patient.active=:patientState
ORDER BY (CASE
          WHEN data_patient_PAT_SEXE.stringValue IS NULL THEN 1
          ELSE 0
      END), data_patient_PAT_SEXE.stringValue ASC

我已經嘗試過使用SQL,我想做的工作完美無缺

LEFT OUTER JOIN dataPatient datapatien1 ON dataset.sId=datapatien1.dataSetSid
AND (datapatien1.itemDefinitionId ='SEXE')
AND datasetdef.id ='DIRECTORY_PATIENT'

我在hibernate https://hibernate.atlassian.net/browse/HHH-7321中聽說過這個問題,但我使用的是hibernate 5.2,應該沒關系

我已經檢查了類似的問題,但沒有人有同樣的情況

謝謝你的幫助

由於“patDatasetDef.id.id”語句,HQL生成此錯誤。 它在解析此語句時遇到問題。

相反,您必須對連接對象使用連接操作,如下所示: 從DomesticCat選擇mother,offspr,mate.name作為母親內部加入mother.mate作為配對左外連接mother.kittens as offspr

使用參考: 供參考使用此鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM