根据实体类和对应主键属性的一个值得到对应的实体:
public <T> T findById(Class<T> entityClass, Serializable entityId) {
return (T) super.getHibernateTemplate().get(entityClass, entityId);
}
如:findById(User.class,"123") ,User为实体类,"123"为User.hbm.xml中<id>属性对应的值。
根据实体类和可变个对应主键属性的值得到所有的实体:
//Serializable... entityIds 为可变参数,即0个或多个
public <T> List<T> findByIds(Class<T> entityClass, final Serializable... entityIds) {
if (entityIds == null || entityIds.length == 0) {
return new ArrayList<T>(0);
}
//根据实体类得到实体名字
String entityName = entityClass.getName();
//创建一个Configuration对象
Configuration cfg = new Configuration();
//根据实体名得到实体对应的mapping
PersistentClass persistentClass = cfg.getClassMapping(entityName);
//如果Configuration中没有对应的mapping,就把这个实体添加进去
if(persistentClass == null){
cfg = cfg.addClass(entityClass);
persistentClass = cfg.getClassMapping(entityName);
}
//得到实体主键对应属性的名字
String pkName = persistentClass.getIdentifierProperty().getName();
//得到实体对应表主键字段的名字(这两种不要弄混淆)
//String pkName = persistentClass.getTable().getPrimaryKey().getColumn(0).getName();
System.out.println(pkName);
try {
String queryString = "from " + entityName + " m where m."
+ pkName + " in (:entityIds)";
if (entityIds.length == 1) {
queryString = "from " + entityClass.getName() + " e where e." + pkName + " = :entityId";
}
final String exeHql = queryString;
return super.getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException,SQLException{
Query query = session.createQuery(exeHql);
if (entityIds.length == 1) {
query = query.setParameter("entityId", entityIds[0]);
} else {
query = query.setParameterList("entityIds", entityIds);
}
return query.list();
}
});
} catch (RuntimeException re) {
throw re;
}
}