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);
}
}
返回实体;
}