一遍又一遍,我注意到自己从休眠中获取了一个列表,接下来的第一件事是将其放在一个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/