![](/img/trans.png)
[英]How can I order a list using the CriteriaQuery in my Specifications?
[英]How do I select list of generic objects in abstract service using CriteriaQuery
嘗試采用這種方法並優化性能:
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;
}
我不知道從這里去哪里。 主鍵不能保證是整數,但幾乎可以肯定會是。
修復問題的方法如下:
//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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.