作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的 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.class
至Usuario
。那是不对的。类和类的实例是不同的东西。类不是实体 - 它是实体的类型。
目前尚不清楚您要如何处理 entity
字段(您在其上调用 toString()
- 您期望结果是什么?)但我怀疑您实际上应该有一个 entityClass
字段,它是 Class<E>
或Class<? extends E>
。从根本上来说,您需要区分这两个概念。
关于java - 从泛型类派生的类没有获得正确的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23759068/
我是一名优秀的程序员,十分优秀!