【问题标题】:Hibernate HQL join fetch with constructorHibernate HQL join fetch 与构造函数
【发布时间】:2017-08-05 23:23:26
【问题描述】:

我正在尝试执行以下 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 语句中的嵌入式构造函数调用来做到这一点?

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

【问题讨论】:

  • 当您删除fetch 并保持关联LAZY 时会发生什么?
  • 相关的档案没有加载,但在这种情况下我需要它
  • 未加载是什么意思,是否没有向 DossierAccount 提供值?
  • DossierAccount 已加载,但关联的 Dossier 未加载。 DossierAccount的hibernate映射中定义了Dossier的多对一关联,不是惰性的。
  • 但是您没有直接使用实体,您使用的是新查询。我怀疑这会“加载”任何实体(取决于您如何定义“加载”,这是我的问题。)

标签: java hibernate hql


【解决方案1】:

现在我更进一步了。以下查询至少选择 Dossier,而不声明 DossierAccount 和 Dossier eager 之间的关联:

        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;
}

但是,这会将整个 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() is not supported by ConstructorNode!”异常

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-02
    • 2013-08-30
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    相关资源
    最近更新 更多