Проблема отображения спящего режима с критериями - PullRequest
0 голосов
/ 15 июня 2011

Когда я выполняю следующий код:

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?

...