一遍又一遍,我注意到自己从休眠中获取了一个列表,接下来的第一件事是将其放在一个idmap中

喜欢:

List<House> entities = s.createCriteria(House.class).list();
Map<String,House> entitymap  = new HashMap<String,House>();
for(TA_entity e:entities){
  entitymap.put(e.getId(), e);
}


有没有办法直接从hibenerate摆脱呢?毕竟,Hibernate熟悉ID。

最佳答案

没有什么可用的,但是扩展CriteriaImpl应该不太困难。就像是:

public class MapCriteria extends CriteriaImpl implements Criteria {

public MapCriteria( Criteria criteria ) {
super( ((CriteriaImpl)criteria).getEntityOrClassName(), ((CriteriaImpl)criteria).getSession() );
}

public <I, T> Map<I, T> map( String indexMethodName ) throws HibernateException {
Map<I, T> map = null;
try {
    List<T> results = list();
    if ( null != results ) {
    map = new HashMap<I, T>();
    if ( !results.isEmpty() ) {
        Class clazz = Class.forName( getEntityOrClassName() );
        Class[] params = new Class[0];
        Method method = clazz.getMethod( indexMethodName, params );
        Object[] args = new Object[0];
        for ( T result : results ) {
        I index =  (I) method.invoke( result, args );
        map.put( index, result );
        }
    }
    }
}
catch (ClassNotFoundException e) {
    throw new HibernateException( e );
}
catch (NoSuchMethodException e) {
    throw new HibernateException( e );
}
    catch (IllegalArgumentException e) {
    throw new HibernateException( e );
    }
    catch (IllegalAccessException e) {
    throw new HibernateException( e );
    }
    catch (InvocationTargetException e) {
    throw new HibernateException( e );
    }
return (Map<I, T>) map;
}


}

那你应该可以打电话

Map<String, House> entitymap  = new MapCriteria(s.createCriteria(House.class).list()).<String, House>map("getId");


这应该使您不必每次都编码转换以映射。

关于java - 开箱即用的方式从 hibernate 中获取给定实体的idmap?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2884643/

10-16 12:30