Назначить строки набора результатов с одинаковым идентификатором в список Java с помощью Hibernate - PullRequest
3 голосов
/ 03 марта 2011

Я использую Hibernate для извлечения некоторых данных из базы данных. Набор результатов, возвращаемый SQL-запросом, который я использую, выглядит примерно так:

SourceId | TargetId
1        | 10
1        | 11
1        | 12
2        | 13
2        | 14

Сейчас у меня что-то вроде следующего класса:

@NamedNativeQuery(name = "myQuery", resultSetMapping = "myMapping", 
    query = "select source.id id1, target.id id2
            + "from someTable source "
            + "left join associationTable association on source.id=association.sourceId "
            + "left join someTable target on association.targetId=target.id "
            + "where source.id in(?1)")

@SqlResultSetMapping(name = "myMapping", 
            entities = @EntityResult(entityClass = DBCalculationElement.class, fields = {
    @FieldResult(name = "targetId", column = "targetId"),
    @FieldResult(name = "sourceId", column = "sourceId") }))

public class MyClass {

    private String sourceId;
    private String targetId;

        public String getSourceId() {
            return sourceId;
        }

        public String getTargetId() {
            return targetId;
        }
}

Несмотря на то, что все работает нормально, и я получаю необходимые результаты, в некоторых случаях набор результатов действительно огромен (тысячи строк), поэтому на получение данных уходит несколько минут. Я знаю, что Hibernate не является лучшим решением с точки зрения производительности, когда дело касается действительно больших наборов результатов, но я стараюсь избегать использования сырого JDBC.

Одним из обходных путей может быть список строк в качестве targetId. Таким образом, используя приведенный выше resultSet в качестве примера, я получу 2 объекта, один с

sourceId = "1" 

, который также имеет список идентификаторов targetIds, содержащий следующее:

targetId = <"10", "11", "12">

и нечто подобное для второго объекта с sourceId = "2".

Кто-нибудь знает, как я могу сделать это с помощью Hibernate? Как я могу отобразить несколько строк в список в Java?

Ответы [ 2 ]

3 голосов
/ 03 марта 2011

Однажды я решил эту проблему, написав хранимую процедуру.Вы можете записать сохраненный процесс для повторения значений целевого идентификатора, разделенных запятыми, для каждого идентификатора источника, и в вашем основном запросе используйте разные значения, чтобы получить уникальный идентификатор источника.

Надеюсь, у вас тоже будет работать.

0 голосов
/ 03 марта 2011

Я знаю, что Hibernate не является лучшим решением с точки зрения производительности, когда дело доходит до действительно больших наборов результатов

Прежде всего, это не так.

... в некоторых случаях набор результатов действительно огромен (тысячи строк) ...

Это не огромный для СУБД, такой как postgres, mysql и так далее ...

Вы должны рассмотреть возможность использования setMaxResults и setFirstResult для разбивки на страницы вашего запроса. (это как смещение и предел).

И вам следует взглянуть на конфигурацию вашего компьютера и JVM, если вы получаете недостаточную производительность при таком простом запросе (да, есть объединения. Но все же, просто).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...