Java 如何使用CriteriaQuery选择抽象服务中的泛型对象列表
尝试采用此方法并优化性能:Java 如何使用CriteriaQuery选择抽象服务中的泛型对象列表,java,hibernate,jboss7.x,ejb-3.2,Java,Hibernate,Jboss7.x,Ejb 3.2,尝试采用此方法并优化性能: public T getByPrimaryKey(PK id) { T entity = getEntityManager().find(getEntityClass(), id); if(entity != null) { preProcessEntity(entity); } fireEvent(entity, IEntityEventService.Event.READ, null); return ent
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列表,并且这些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;
}
公共列表getEntitiesByPrimaryKey(列表pks){
CriteriaBuilder cb=getEntityManager().getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery(getEntityClass());
Root=cq.from(getEntityClass());
元模型m=getEntityManager().getMetamodel();
EntityType T_Um=m.entity(getEntityClass());
Path keyPath=root.get(T_.getDeclareId(getEntityClass());
选择(根);
cq.where(keyPath.in(pks));
列表实体=getEntityManager().createQuery(cq).getResultList();
if(实体!=null){
对于(T实体:实体){
实体(实体);
fireEvent(实体,IEntityEventService.Event.READ,null);
}
}
返回实体;
}
我不知道从这里到哪里去。主键不能保证是整数,但几乎可以肯定是整数。以下是修复它的方法:
//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;
}
//从泛型类型参数列表中获取primaryKeyClass(这是AbstractService)
@抑制警告(“未选中”)
受保护的类primaryKeyClass=(类)GenericTypeResolver.resolveTypeArguments(getClass(),AbstractService.Class)[0];
受保护类getPrimaryKeyClass(){
返回primaryKeyClass;
}
//基于主键检索通用列表的代码
公共列表getEntitiesByPrimaryKey(列表pks){
如果(pks==null | | pks.size()==0)
返回新的ArrayList();
CriteriaBuilder cb=getEntityManager().getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery(getEntityClass());
Root=cq.from(getEntityClass());
元模型m=getEntityManager().getMetamodel();
EntityType T_Um=m.entity(getEntityClass());
Path-keyPath=root.get(T_.getId(getPrimaryKeyClass());
选择(根);
cq.where(keyPath.in(pks));
列表实体=getEntityManager().createQuery(cq).getResultList();
if(实体!=null){
对于(T实体:实体){
实体(实体);
fireEvent(实体,IEntityEventService.Event.READ,null);
}
}
返回实体;
}