从泛型类派生的类不会获得正确的类型 [英] Class derived from generic class don't get the correct type

查看:96
本文介绍了从泛型类派生的类不会获得正确的类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  public class Dao< E>在我的Spring项目中,我有这个模板用于我的Dao类。 {

私人最终E实体;

@Autowired
SessionFactory sessionFactory;

protected Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}

public Dao(E entity){
this.entity = entity;
}

public Dao(Class<?> class){
this.entity =(E)classe;
}

public E getEntity(){
return this.entity;
}

@Transactional
public boolean persist(E transientInstance){
sessionFactory.getCurrentSession()。persist(transientInstance);
返回true;
}

@Transactional
public boolean remove(E transientInstance){
sessionFactory.getCurrentSession()。delete(transientInstance);
返回true;
}

@Transactional
public boolean merge(E detachedInstance){
sessionFactory.getCurrentSession()。merge(detachedInstance);
返回true;
}

@Transactional
public E findById(int id){
E instance =(E)sessionFactory.getCurrentSession()。get(entity.getClass() , ID);
返回实例;
}

@Transactional
public E findByField(String field,String value){
String expressao = entity.toString();
String nome_classe = new String();
StringTokenizer st = new StringTokenizer(expressao); (st.hasMoreTokens()){
nome_classe = st.nextToken();
}
String query =from+ nome_classe +where+ field +=:data;

Query q = sessionFactory.getCurrentSession()。createQuery(query);
q.setParameter(data,value);
E instance =(E)q.uniqueResult();
返回实例;
}

@Transactional
public List< E> findAll(){
List< E> instance(= List< E>)sessionFactory.getCurrentSession()。createSQLQuery(select * from usuario).list();
返回实例;
}

}

我的每个Dao类都有这个结构:

  @Repository 
public class UsuarioHome扩展了Dao< Usuario> {

public UsuarioHome(){
super(Usuario.class);
}

}

这意味着当我打电话给方法findById,findByField,findAll,我应该从类型Usuario,Usuario和List中接收一个对象。



两个拳头类别重新返回正确的值,但最后一个T。当我运行这个方法时(从我的服务类):

  @Transactional 
public List< Usuario> listagem_usuarios(){
List< Usuario> lista = usuario.findAll();
System.out.println(listagem_usuario find+ lista.size()+users);
System.out.println(lista.getClass()。getName());
for(int i = 0; i< lista.size(); i ++){
System.out.println(i =+ i +{);
if(lista.get(i)instanceof Usuario)
System.out.println(usuario);
else if(lista.get(i)instanceof Object)
System.out.println(object);
else
System.out.println(outro);
System.out.println(});
}
return lista;
}

我收到object作为回应,当我看到usuario 。任何人都可以告诉我在这里做错了什么?

解决方案

问题出在您的通用 DAO findAll方法;您正在使用查询字符串 select * from usuario

  @Transactional 
公开列表< E> findAll(){
List< E> instance(= List< E>)sessionFactory.getCurrentSession()。createSQLQuery(select * from usuario).list();
返回实例;
}

如何试试这样;

  @Transactional 
public List< E> findAll(){
return(List< E>)sessionFactory.getCurrentSession()。createCriteria(entity)
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();
}

以下是您的模板 DAO class;


  1. 我更喜欢这个变量声明

      private Class< E>实体; 


  2. 在构造函数中使用 class 参数

      public Dao(Class< E> clazz){
    this.entity = clazz;
    }



In my spring project, I have this template for my Dao classes:

public class Dao<E> {

    private final E entity;

    @Autowired
    SessionFactory sessionFactory;

    protected Session getCurrentSession(){
        return sessionFactory.getCurrentSession();
    }

    public Dao(E entity) {  
        this.entity = entity;
    }

    public Dao(Class<?> classe) {
        this.entity = (E) classe;
    }

    public E getEntity() {
        return this.entity;
    }

    @Transactional
    public boolean persist(E transientInstance) {
        sessionFactory.getCurrentSession().persist(transientInstance);
        return true;
    }

    @Transactional
    public boolean remove(E transientInstance) {
        sessionFactory.getCurrentSession().delete(transientInstance);
        return true;
    }

    @Transactional
    public boolean merge(E detachedInstance) {
        sessionFactory.getCurrentSession().merge(detachedInstance);
        return true;
    }

    @Transactional
    public E findById(int id) {
        E instance = (E) sessionFactory.getCurrentSession().get(entity.getClass(), id);
        return instance;
    }

    @Transactional
    public E findByField(String field, String value) {
        String expressao = entity.toString();
        String nome_classe = new String();
        StringTokenizer st = new StringTokenizer(expressao);
        while (st.hasMoreTokens()) {
            nome_classe = st.nextToken();
        }
        String query = "from "+nome_classe+" where "+field+" = :data";

        Query q = sessionFactory.getCurrentSession().createQuery(query);
        q.setParameter("data", value);
        E instance = (E) q.uniqueResult();
        return instance;
    }

    @Transactional
    public List<E> findAll() {
        List<E> instance = (List<E>) sessionFactory.getCurrentSession().createSQLQuery("select * from usuario").list();
        return instance;
    }

}

Each one of my Dao classes have this structure:

@Repository
public class UsuarioHome extends Dao<Usuario> {

    public UsuarioHome() {
        super(Usuario.class);
    }

}

Which means that when I call the methods findById, findByField, findAll, I should receive a object from types Usuario, Usuario and List.

The two fist classesa re returning the right value, but the Last one don't. When I run this method (from my service class):

@Transactional
public List<Usuario> listagem_usuarios() {
    List<Usuario> lista = usuario.findAll();
    System.out.println("listagem_usuario find "+lista.size()+" users");
    System.out.println(lista.getClass().getName());
    for(int i=0; i<lista.size(); i++) {
        System.out.println("i = "+i+" {");
        if(lista.get(i) instanceof Usuario)
            System.out.println("usuario");
        else if(lista.get(i) instanceof Object)
            System.out.println("object");
        else
            System.out.println("outro");
        System.out.println("}");
    }
    return lista;
}

I am receiving "object" as response, when I should see "usuario". Anyone can tell what I doing wrong here?

解决方案

The problem is in your generic DAO findAll method; you are using query string select * from usuario

@Transactional
public List<E> findAll() {
        List<E> instance = (List<E>) sessionFactory.getCurrentSession().createSQLQuery("select * from usuario").list();
        return instance;
}

How try with like this;

@Transactional
public List<E> findAll() {
return (List<E>) sessionFactory.getCurrentSession().createCriteria(entity)
        .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();
}

Here are also suggestions for your template DAO class;

  1. I prefer to this variable declaration

    private Class<E> entity;
    

  2. And in constructor with class argument

    public Dao(Class<E> clazz) {
        this.entity = clazz;
    }
    

这篇关于从泛型类派生的类不会获得正确的类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆