尝试采用这种方法并优化性能:
public T getByPrimaryKey(PK id) {
T entity = getEntityManager().find(getEntityClass(), id);
if(entity != null) {
preProcessEntity(entity);
}
fireEvent(entity, IEntityEventService.Event.READ, null);
return entity;
}
原因是我们有很多区域可以根据本机查询获取 Id 列表,并且它们是单独处理的,导致 Hibernate 创建单个查询。我想让 Hibernate 一次获取所有这些。
public List<T> getEntitiesByPrimaryKey(List<PK> pks) {
CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
CriteriaQuery<T> cq = cb.createQuery(getEntityClass());
Root<T> root = cq.from(getEntityClass());
Metamodel m = getEntityManager().getMetamodel();
EntityType<T> T_ = m.entity(getEntityClass());
Path<T> keyPath = root.get(T_.getDeclaredId(getEntityClass()));
cq.select(root);
cq.where(keyPath.in(pks));
List<T> entities = getEntityManager().createQuery(cq).getResultList();
if(entities != null) {
for (T entity : entities) {
preProcessEntity(entity);
fireEvent(entity, IEntityEventService.Event.READ, null);
}
}
return entities;
}
我不知道从这里去哪里。主键不保证是整数,但几乎可以肯定会。