Повторение списка критериев гибернации - PullRequest
1 голос
/ 25 июля 2011

У меня есть следующий раздел кода, который я хочу использовать для возврата коллекции моего объекта:

Session session = HibernateUtil.getSession();

List<MyObj> myObjList = (List<MyObj>) 
        session.createCriteria(MyObj.class)
            .add(Restrictions.eq("searchField", searchField)).list();

Iterator<MyObj> myObjIt = myObjList.listIterator();
log.debug("list size: " + myObjList.size());

while(myObjIt.hasNext()){
    MyObj myObj = myObjIt.next();
    log.debug(myObj.getMyField());

}

Однако мой журнал продолжает печатать одну и ту же запись столько раз, сколько размер списка. Если я немного рефакторинг, мой код работает правильно, как это:

SQLQuery query = session.createSQLQuery(
    "select my_field from my_table where search_field = :searchField"
    );

query.setParameter("myField", myField);
List result = query.list();
for(Iterator iter = result.iterator(); iter.hasNext();){
    Object[] row = (Object[]) iter.next();
    log.debug(row[0]);
}

Что-то не так в моем первом сегменте кода? Я должен быть в состоянии пойти по этому пути в любом случае, и, поскольку я использую Hibernate, я бы предпочел, чтобы ORM работал как положено, поэтому я бы предпочел первый метод перед вторым. У кого-нибудь есть мысли?

Fwiw, я использую Hibernate 3.5.4 final, Hibernate-validator 4.2.0 Final, hibernate-search 3.4.0 Final и hibername-c3p0 3.6.5 final, все из репозиториев maven.

Отредактировано для уточнения на основе комментариев.

1 Ответ

1 голос
/ 25 июля 2011

Из того, что вы описали в вопросе, оба ваших сегмента кода должны возвращать одинаковые результаты. Предполагая, что в первом сегменте кода Hibernate выполняет почти тот же запрос, что и во втором сегменте (вы можете проверить его в журнале, просто включив параметр конфигурации 'hibernate.show_sql') - проблема заключается в том, что где-то преобразовывается набор результатов в список MyObj. Маловероятно, что это происходит из-за ошибки в спящем режиме, поэтому это может быть связано с неправильным отображением классов сущностей. Если вы не видите проблем с отображением, добавьте больше деталей к вопросу (ваш класс сущностей с отображениями, схема таблицы БД и образец данных), чтобы любой мог воспроизвести проблему.

Вероятно, ваш класс MyObj не имеет правильно определенного сопоставления столбца Id. Например, если поле / свойство, сопоставленное с Id, имеет одинаковое значение для всех объектов в списке результатов, hibernate вернет те же объекты (как в вашем случае). Относительно использования примитивов в качестве типа идентификатора: hibernate позволяет использовать примитивные типы, но в документации есть следующая строка:

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

Обобщение возможных проблем с отображением идентификаторов: 1. Id сопоставленный столбец не является уникальным в БД. 2. Соответствующий метод установки для сопоставленного метода получения свойства Id не указан или не сохраняет значение переданного аргумента. 3. Необнуляемый тип поля Id.

...