Hibernate - 通过ID只返回类来返回实体的集合

时间:2010-06-24 13:48:51

标签: java hibernate orm

如何加载给定类的实体集合,只需一次访问数据库,例如:

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

我知道如果我只想获取一个实体,我可以使用:

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

但似乎没有Seri​​alizables集合的匹配选项。

请注意,由于我只知道该类,因此我不知道标识列的名称,因此在没有首先发现ID列的情况下,不能选择简单的HQL / Criteria API。

3 个答案:

答案 0 :(得分:2)

正如您在问题中所建议的,您可以发现ID属性名称,然后使用它来构建您的条件。使用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 :(得分:1)

您不能只执行HQL查询 - “from MyEntity where ...”,它会返回实体列表吗?只需手动构建where子句。另一种选择是使用Criteria API。

修改:使用“where id = ...”。无论如何命名,Hibernate都会自动为您找到id列。

答案 2 :(得分:1)

Hibernate不提供开箱即用的支持。但是你可以借助特殊的id属性在HQL中实现这一点:

  

14.5. Referring to identifier property

     

有两种方式可以参考   实体的标识符属性:

     
      
  • 特殊属性(小写)id可用于引用   实体的标识符属性   但实体不这样做   定义一个名为的非标识符属性   id
  •   
  • 如果实体定义了命名标识符属性,则可以使用该属性   财产名称。
  •   

所以你可以这样做:

Query q = session.createQuery("from " + clazz.getName() + " where id IN :idList")