Почему session.createCriteria (classtype) .list () возвращает больше объектов, чем в списке? - PullRequest
2 голосов
/ 06 января 2012

Почему session.createCriteria (classtype) .list () возвращает больше объектов, чем в списке ?

Возвращенный список содержит повторяющиеся объекты в случайном порядке.

public Collection getAll() {
        List list = null;
        Session session = null;
        Transaction tx = null;
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            tx = session.beginTransaction();
            list = session.createCriteria(getClassType()).list();
            tx.commit();
        } catch (HibernateException ex) {
            if (tx != null) {
                tx.rollback();
            }
            LOGGER.error("HibernateException in getAll");
        } finally {
            if (session != null && session.isOpen()) {
                session.close();
            }
        }
        return list;
    }

Ответы [ 3 ]

2 голосов
/ 06 января 2012

Я предполагаю, что ваш session.createCriteria(classtype).list() вызов несколько раз возвращает некоторые объекты этого класса.

Это может произойти, если у вас есть отношение OneToMany или ManyToMany, которое охотно выбирается.

Один из способов решить эту проблему, как правильно указывает Дж. Б. Низет, - это использовать Criteria.DISTINCT_ROOT_ENTITY ResultTransformer.

Это, однако, сделает работу на «стороне Java»: все объекты будут извлечены из базы данных, а затем все дубликаты будут удалены.

Было бы намного лучше сделать OneToMany или ManyToMany ленивым (что по умолчанию) вместо нетерпеливого.

2 голосов
/ 06 января 2012

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

criteria.setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE);

или вернуть набор, а не список, если порядок не важен.

1 голос
/ 01 февраля 2012

Спасибо за помощь, я воспользовался им и решил проблему следующим образом:

...
try {
            session = HibernateUtil.getSessionFactory().openSession();
            tx = session.beginTransaction();
            Criteria criteria = session.createCriteria(getClassType())
                .setProjection(Projections.id())
                .setFirstResult(getStart())
                .setMaxResults(getLength());    
            HashSet<Long> ids = new HashSet( criteria.list() );            

            criteria = session.createCriteria(getClassType())
                .add(Restrictions.in(ID_COLUMN_NAME, ids))
            TreeSet<Employee> items = new TreeSet( criteria.list() );

            list = new ArrayList<Employee>(items);

            tx.commit();
        } catch (HibernateException ex) {
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...