Когда я выполняю следующий код:
String sqlQuery = "SELECT {msg.*}, {cmd.*} " +
"FROM schemaName.Messages AS msg " +
"LEFT OUTER JOIN schemaName.send_commands AS cmd " +
" ON cmd.message_key = msg.unique_key " +
" AND ( cmd.priority = 1 ) " +
"WHERE msg.sequence_received < 10";
Query query = session.createSQLQuery( sqlQuery )
.addEntity( "msg",Messages.class )
.addJoin( "cmd","msg.commands" )
.addJoin( "msg", "cmd.message" );
query.setResultTransformer( Criteria.DISTINCT_ROOT_ENTITY );
Я получаю правильный набор результатов: все сообщения загружаются, а некоторые команды SendCommands загружаются таким образом, что msg.getCommands()
НЕ делаетвыдать дополнительный запрос SQL.Таким образом, вся необходимая информация была извлечена и правильно сопоставлена.
Однако у меня есть проблема со следующим кодом:
Criteria crit = session.createCriteria( Messages.class )
.add( Restrictions.lt( "sequenceReceived", Long.valueOf( 10 )) )
.setFetchMode( "commands", FetchMode.JOIN )
.createAlias( "commands", "cmd", Criteria.LEFT_JOIN, Restrictions.eq( "cmd.priority", 1 ) )
.setResultTransformer( Criteria.DISTINCT_ROOT_ENTITY );
, hibernate удается генерировать правильный код SQL:
SELECT [...]
FROM schemaName.Messages AS msg LEFT OUTER JOIN schemaName.send_commands AS cmd
ON cmd.message_key = msg.unique_key AND ( cmd.priority = 1 )
WHERE msg.sequence_received < 10
Проблема в том, что когда я пытаюсь использовать msg.getCommands()
, Hibernate выдает новый SQL-запрос и получает команды sendCommands, связанные с данным сообщением.Есть ли способ исправить сопоставление или получить фактическую Eager Fetch?