2017-03-15 35 views
-2

我试图执行以下HQL语句获取:Hibernate的HQL加入与构造

 queryString = "select new DossierAccount(dossier,dossierAccount.accountNumber) from DossierAccount as dossierAccount join fetch dossierAccount.dossier as dossier" + 
        " where dossier.kycId.id != :kycId and dossierAccount.accountNumber in :accountNumbers"; 

这导致org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list例外。当我删除“获取”它的作品。然而,DossierAccount和Dossier之间的关联被指定为“懒惰”,我不想改变它。但在这种特殊情况下,我需要急切地加载档案。

它也适用,当我用变量“accountNumber”替换构造函数调用。但是我需要减少这里所选属性的数量。

有没有办法在select语句中使用嵌入式构造函数调用?

还有一个问题:我还需要限制加入的Dossier的选定属性的数量。有没有办法做到这一点?

+0

当你删除'fetch'并保持关联'LAZY'时会发生什么? – Tobb

+0

相关档案未加载,但我需要它在这种情况下 – thmayr

+0

什么是未加载的意思,是否没有提供给DossierAccount的值? – Tobb

回答

0

现在我更进一步了。下面的查询选择至少卷宗,没有宣布DossierAccount和档案渴望之间的关联:

 queryString = "select new DossierAccount((select dossier from Dossier as dossier where dossier.dossierId=dossierAccount.dossier.dossierId),dossierAccount.accountNumber) from DossierAccount as dossierAccount" + 
        " where dossierAccount.dossier.kycId.id != :kycId and dossierAccount.accountNumber in :accountNumbers"; 

为此下面的构造是必需的:

public DossierAccount(Dossier dossier, AccountNumber accountNumber) { 
    this.accountNumber = accountNumber; 
    this.dossier  = dossier; 
} 

但是这个加载整个档案内存中的数据,我不需要。于是,我选择有限的一组档案的属性用下面的语句:

 queryString = "select new DossierAccount((select new Dossier(dossier.kycId,dossier.relationshipName) from Dossier as dossier where dossier.dossierId=dossierAccount.dossier.dossierId),dossierAccount.accountNumber) from DossierAccount as dossierAccount" + 
        " where dossierAccount.dossier.kycId.id != :kycId and dossierAccount.accountNumber in :accountNumbers"; 

但是,这导致了“ava.lang.UnsupportedOperationException:getDataType()不支持ConstructorNode”例外