うまくいけば、Hibernate の第一人者が助けてくれるでしょう。
次のようなオブジェクト構造があります。
class Customer {
private Stuff1 stuff1;
private Stuff2 stuff2;
// Bazillion other fields
}
class Report {
private Customer customer;
private String uniqueBatchId;
// Bazillion other fields
}
class AbstractSpecialReport {
private Report report;
//Bunch of other fields
}
class SpecialReport extends AbstractSpecialReport{
private List<ReportParts> reportParts;
}
3 つすべてに Hibernate エンティティとして注釈が付けられ、すべての関連付けはデフォルトです (Hibernate 3.2 を使用するため、デフォルトでは遅延する必要があります。
を使用して、この HQL を使用して結果を取得したいと考えていますScrollableResults
。結果セットをストリーミングするために必要な呪文を実行しました。
select srpt
from SpecialReport as srpt
left join fetch srpt.report as rpt
left join fetch rpt.customer as cst
left join fetch cst.stuff1
left join fetch cst.stuff2
where rpt.uniqueBatchId = :batchId
しかし、「java.sql.SQLException: ストリーミング結果セット com.mysql.jdbc.RowDataDynamic@633f8d4f はまだアクティブです。ストリーミング結果セットが開いていて、特定の接続で使用されている場合、ステートメントは発行されません。さらにクエリを試行する前に、アクティブなストリーミング結果セットに対して .close() を呼び出しました。」
私は SQL クエリのログを記録しています。レポートが前方にスクロールされた後、関連のないプロパティを取得しようとしていることがはっきりとわかります。
そこで、これらのフィールドを含めるように HQL を拡張し始めました。
今は次のように見えます
select srpt
from SpecialReport as srpt
left join fetch srpt.report as rpt
left join fetch rpt.customer as cst
left join fetch rpt.field1
left join fetch rpt.field2
left join fetch rpt.field3
left join fetch rpt.field4 as child
-- now field 4 was an object that also has fields that are associations.
left join fetch child.field1
left join fetch child.field2
-- ad nauseum, this keeps going down the object tree
left join fetch cst.stuff1
left join fetch cst.stuff2
where rpt.uniqueBatchId = :batchId
約 25 の結合があっても、ロードされているフィールドがさらにあり、同じ例外が発生します。手動でグラフを歩き続けることもできますが、これには永遠に時間がかかります。これは必要ではないと思います。Hibernate コードを見るとTwoPhaseLoad
、スクロールによって呼び出され、オブジェクト内のすべてのプロキシと遅延ロードされたフィールドを初期化しようとしているように見えます。これは、スクロールの実行中に他の SQL クエリを実行しないという要件を必然的に破ります。これは誰にとっても意味がありますか?