Hibernate - возвращает коллекцию сущностей по ID, зная только класс - PullRequest
2 голосов
/ 24 июня 2010

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

 public Collection<Object> getEntities(Class<?> entityClass,Collection<Serializable> listOfIDs);

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

sessionFactory.getCurrentSession().get(Class,Serializable);

, но, похоже, не существует подходящей опции для коллекции Serializables.

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

Ответы [ 3 ]

2 голосов
/ 05 июня 2013

Как вы предложили в своем вопросе, вы можете найти имя свойства идентификатора и затем использовать его для построения ваших критериев.Используйте SessionFactory, чтобы получить ClassMetadata и спросите его для IdentifierPropertyName.Вот небольшой фрагмент, который делает то, что вам нужно.

public <T> List<T> listByIds(Class<T> entityType, Collection<? extends Serializable> ids) {
        Session session = getSession();
        String idPropertyName = session.getSessionFactory().getClassMetadata(entityType).getIdentifierPropertyName();

        Criteria criteria = session.createCriteria(entityType)
                .add(Restrictions.in(idPropertyName, ids));

        return criteria.list();
    }
1 голос
/ 24 июня 2010

Hibernate не предоставляет поддержку для этого из коробки.Но вы можете достичь этого в HQL с помощью специального свойства id:

14.5.Ссылаясь на свойство идентификатора

Существует два способа ссылаться на свойство идентификатора объекта:

  • Специальное свойство (строчные буквы) id может использоваться для ссылки на идентификаторсвойство сущности при условии, что сущность не определяет свойство неидентификатора с именем id.
  • Если сущность определяет свойство именованного идентификатора, вы можете использовать это имя свойства.

Так что вы можете сделать что-то вроде этого:

Query q = session.createQuery("from " + clazz.getName() + " where id IN :idList")
1 голос
/ 24 июня 2010

Разве вы не можете просто выполнить запрос HQL - "from MyEntity where ...", который вернет список объектов? Просто создайте предложение where вручную. Другой вариант - использовать Критерии API.

Редактировать: использовать "where id = ...". Hibernate автоматически найдет для вас столбец id, как бы он ни назывался.

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