这个问题描述起来有点困难。举这么一个例子吧,我在用struts2+spring+hibernate做系统,按照一般的套路,我必须写DAO实现对hibernate对数据库的访问的封装。 hibernate中对数据库记录的获取有个get方法。比如我要获取user表的记录(假设对应的类为User.class),使用session.get(User.class,new Integer(1)); 我的数据库中有很多表,按照传统的方法,我得写很多个DAO,比如user表,product表(假设对应的类为Product.class)对应的DAO分别为(只示意性写出关键部分): 
public class UserDao { 
public User get(Integer I) { 
session.get(User.class,I); 

} public class ProductDao { 
public Product get(Integer I) { 
session.get(Product.class,I); 

} 仔细研究,发现两个DAO相似度很高,我就想使用泛型把它们合二为一,我写了下面的泛型类 
public class Dao<T,KEY> { 
public Product get(KEY key) { 
session.get(?,key); 

} 这样,我想获得user表的记录时我就这样写 
Dao<User,Integer> userDao; 
userDao.get(new Integer(1)); 我想获得product表的记录时这样写: 
Dao<Product,Integer> pruductDao; 
productDao.get(new Integer(1)); 但是,现实和理想总是差距很大,问题出现了,就是上面的问号的地方,我不知把类T的类名写在问号的位置。我尝试直接写T、T.class、Class(T)等等都无法编译。 

解决方案 »

  1.   

    给你个我些的通用查询。你再按需要继续修改
    public List<?> list(Class queryClass, Map<String, Object> condition, String orderby, Integer pageSize, Integer pageIndex) {
    try {
    Criteria criteria = this.getSession().createCriteria(queryClass);
    if(condition!=null){
    for(Entry<String, Object> entry : condition.entrySet()){
    String key = entry.getKey();
    Object value = entry.getValue();
    if(value!=null){
    if(value.toString().indexOf("%")==-1)
    criteria.add(Restrictions.eq(key, value));
    else 
    criteria.add(Restrictions.like(key, value));
    }
    }
    }
    if(orderby != null ){
    if(orderby.trim().endsWith("desc"))//降序
    criteria.addOrder(Order.desc(orderby.trim().split(" ")[0]));
    else
    criteria.addOrder(Order.asc(orderby.trim().split(" ")[0]));
    }
    if(pageIndex!=null && pageSize!=null){
    criteria.setFirstResult((pageIndex-1)*pageSize);
    criteria.setMaxResults(pageSize);
    }
    return criteria.list();
    } catch (Exception e) {
    return new ArrayList();
    }
    }
      

  2.   

    public class Dao <T,KEY> { 
    public Product get(KEY key) { 
    session.get(key.getClass(),key); 

    }
      

  3.   

    如果你想做通用一点,你把类模板也传入不久好了?
    public class Dao <T> { 
     public T get(Class cls,Integer key) { 
      return (T)session.get(cls,key); 
     } 
    }或者
    public class Dao <T> { 
     private T t;
     public T get(Integer key) { 
      return (T)session.get(t.getClass,key); 
     } 
    }
      

  4.   

    为什么要用泛性呢,这个问题用“组合”不是可以很好的解决吗?泛性是在jdk5.0以上才支持,所以现在开发系统泛性几乎都不用泛性。
    看下面的代码可以解决你的问题不。有时间了多看看设计模式的书。给你推荐一本<<Head First Design Patterns>>
    package src.test;public class Client {
    public static void main(String[] args){
    Dao dao1=new Dao(new User1());
    dao1.get(1l);


    Dao dao2=new Dao(new User2());
    dao2.get(1l);
    }
    }class Dao{
    private Object o;

    public Dao() {
    super();
    }
    public Dao(Object o) {
    super();
    this.o = o;
    }
    public Object get(Long key) {
    System.out.println(o.getClass());
    /*
     * session.get(o.getClass(),key); 
     * */
    return null;
    }
    }class User1{

    }
    class User2{

    }