"left" ist der Default, wenn man das beim Join (wie oben gezeigt) weglässt.
Hinzu kommt, dass eigentlich ein Inner-Join benötigt wird, da die Where-Klausel nicht auf NULL abfragt.

Ich stimme da eher Birgitta zu.
Vielleicht kann das dann per "exists" (automatisch) aufgelöst werden.
Der Index kann entweder über "Key2, Number" oder umgekehrt erstellt werden.

Ich kann mir andererseits nicht vorstellen, dass Hibernate hier so schlecht ist. D*B kann da ggf. mehr dazu sagen.
Vielleicht stimmt das Datenmodell nicht ganz?
Außerdem besteht die Gefahr, dass der SQL irgendwann größer 32K wird (falls die Grenze noch besteht).