In einem konkreten Fall ist es vorgekommen, dass Tabellen in Hibernate nicht sauber gemappt werden konnten. So wurde jede Tabelle auf eine eigene Klasse gemappt. Mussten nun Datensätze über mehrere Tabellen verknüpft eingelesen werden, so wurde im ersten Ansatz die passenden Datensätze der jeweiligen Tabellen eingelesen und dann mittels Javacode miteinander verknüpft. Das Problem war dabei, dass die Einschränkungen (Where-Bedingungen) nicht unbedingt performance-orientiert umgesetzt werden konnten. Wenn man 300 IDs ermittelt und diese dann in eine IN-Bedingungen im Select einbinden muss ist dies nicht gerade performant. Dieser Ansatz ist alles andere als berauschend, also habe ich nochmal etwas nachgelesen und nun folgenden Ansatz gefunden.
Die Tabellen werden jetzt mittels HQL verknüpft und es werden die passenden Datensätze der Tabellen in einem Datensatz zurückgeliefert, eingebetet in eine Liste.
Angenommen wir haben drei Tabellen, deren Hibernateklassen den Namen der Tabellen haben, z.B. Tabelle1, Tabelle2 und Tabelle3. Die Tabellen sind über ID-Attribute miteinander verbunden, z.B. Tabelle1.tabelle1_id.
Möglicher Code könnte dann wie folgt aussehen :
String query_string = "from " +
" Tabelle1 tab1, " +
" Tabelle2 tab2, " +
" Tabelle3 tab3 " +
"where " +
" tab1.tabelle1_id = tab2.tabelle1_id " +
"and " +
" tab2.tabelle2_id = tab3.tabelle2_id " +
"and " +
" tab3.tabelle3_id = :tabelle3_id";
Query query = session.createQuery( query_string );
query.setTimestamp( "tabelle3_id", tab3_id );
query_resultset = query.list();
if( !query_resultset.isEmpty() )
{
daten1 = new Tabelle1[ query_resultset.size() ];
daten2 = new Tabelle2[ query_resultset.size() ];
daten3 = new Tabelle3[ query_resultset.size() ];
int i = 0;
for( Iterator iter = query_resultset.iterator(); iter.hasNext(); )
{
Object[] elemente = ( Object[] )iter.next();
if( elemente.length == 3 )
{
daten1[ i ] = ( Tabelle1 )elemente[ 0 ];
daten2[ i ] = ( Tabelle2 )elemente[ 1 ];
daten3[ i ] = ( Tabelle3 )elemente[ 2 ];
}
i++;
}
Sollen z.B. nicht die Daten alle im Select aufgeführten Tabellen zurückgeliefert werden, so kann der HQL-Select wie folgt ergänzt werden :
String query_string = "Select " +
" tab1 " +
"from " +
" Tabelle1 tab1, " +
" Tabelle2 tab2, " +
" Tabelle3 tab3 " +
"where " +
" tab1.tabelle1_id = tab2.tabelle1_id " +
"and " +
" tab2.tabelle2_id = tab3.tabelle2_id " +
"and " +
" tab3.tabelle3_id = :tabelle3_id";
Jetzt wird nur Tabelle1 pro Datensatz zurückgeliefert.