如何加载给定类的实体集合,只需一次访问数据库,例如:
public Collection<Object> getEntities(Class<?> entityClass,Collection<Serializable> listOfIDs);
我知道如果我只想获取一个实体,我可以使用:
sessionFactory.getCurrentSession().get(Class,Serializable);
但似乎没有Serializables集合的匹配选项。
请注意,由于我只知道该类,因此我不知道标识列的名称,因此在没有首先发现ID列的情况下,不能选择简单的HQL / Criteria API。
答案 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")