java - 从泛型类派生的类没有获得正确的类型

标签 java hibernate generics dao

在我的 Spring 项目中,我的 Dao 类有这个模板:

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;
    }

}

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

@Repository
public class UsuarioHome extends Dao<Usuario> {

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

}

这意味着当我调用 findById、findByField、findAll 方法时,我应该从 Usuario、Usuario 和 List 类型接收一个对象。

前两个类返回正确的值,但最后一个类没有返回正确的值。当我运行此方法时(从我的服务类):

@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;
}

当我应该看到“usuario”时,我收到“object”作为响应。谁能告诉我我在这里做错了什么?

最佳答案

我强烈怀疑这就是问题所在:

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

您正在有效地转换Usuario.classUsuario 。那是不对的。类和类的实例是不同的东西。类不是实体 - 它是实体的类型。

目前尚不清楚您要如何处理 entity字段(您在其上调用 toString() - 您期望结果是什么?)但我怀疑您实际上应该有一个 entityClass字段,它是 Class<E>Class<? extends E> 。从根本上来说,您需要区分这两个概念。

关于java - 从泛型类派生的类没有获得正确的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23759068/

相关文章:

Java:ButtonGroup 不会显示

java - 需要将通过 jpa 获取的 uniqueresult 转换为 String 数组的解决方案

java - ASN.1 Java 编译器

java - 错误 : Could not find or load main class –Xmx1G

java - 如何使用 Java 获取总 JVM 堆大小、已用内存

hibernate - 如何在spring boot data jpa中链接@Entity之间的外键

java - 尝试从下拉列表添加到数据库

c# - 泛型方法中的条件类型

c# - 泛型有什么好处,为什么要使用它们?

c# - 通用静态类有多个实例?