尝试采用此方法并优化性能:
public T getByPrimaryKey(PK id) {
T entity = getEntityManager().find(getEntityClass(), id);
if(entity != null) {
preProcessEntity(entity);
}
fireEvent(entity, IEntityEventService.Event.READ, null);
return entity;
}
原因是我们在很多领域都可以根据 native 查询获取 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;
}
我不知道从这里该去哪里。主键不保证是整数,但几乎肯定是。
最佳答案
解决方法如下:
//grabs the primaryKeyClass from generic type argument list (this was AbstractService<PK, T>)
@SuppressWarnings("unchecked")
protected Class<PK> primaryKeyClass = (Class<PK>) GenericTypeResolver.resolveTypeArguments(getClass(), AbstractService.class)[0];
protected Class<PK> getPrimaryKeyClass() {
return primaryKeyClass;
}
//code to retrieve generic list based on primary key
public List<T> getEntitiesByPrimaryKey(List<PK> pks) {
if(pks == null || pks.size() == 0)
return new ArrayList<T>();
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<PK> keyPath = root.get(T_.getId(getPrimaryKeyClass()));
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;
}
关于java - 如何使用 CriteriaQuery 选择抽象服务中的通用对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27112701/