簡體   English   中英

從泛型類派生的類沒有獲得正確的類型

[英]Class derived from generic class don't get the correct type

在我的春季項目中,我的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”時收到“對象”作為響應。 有人可以告訴我我在做什么錯嗎?

我強烈懷疑這是問題所在:

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

您實際上是將Usuario.class強制Usuario.classUsuario 那是不對的。 類和類的實例是不同的東西。 該類不是實體-它是實體的類型。

尚不清楚您要對entity字段進行什么操作(正在調用toString() -您期望結果是什么?),但我懷疑您實際上應該有一個entityClass字段,這是一個Class<E>Class<? extends E> Class<? extends E> 從根本上講,您需要區分這兩個概念。

您的findAll()方法錯誤。 它使用一個SQL查詢來選擇名為usuario的表的所有列,該查詢返回一個List<Object[] >,而不是使用一個HQL查詢返回該泛型實體的所有實例。 該代碼應為

String hql = "select u from " + entity.getName() + " u";
return (List<E>) sessionFactory.getCurrentSession().createQuery(hql).list();

如果實體字段包含實體 (在這種情況下,即Usuario.class ,這是正確的。 有關此說明,請參閱喬恩·斯基特(Jon Skeet)的答案。

問題出在您的通用DAO findAll方法中。 您正在使用查詢字符串select * from usuario

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

怎么這樣嘗試?

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

這也是您的模板DAO類的建議;

  1. 我更喜歡這個變量聲明

     private Class<E> entity; 
  2. 並在帶有class參數的構造函數中

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM