从泛型类派生的类不会获得正确的类型 [英] Class derived from generic class don't get the correct type
问题描述
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;
-
我更喜欢这个变量声明
private Class< E>实体;
-
在构造函数中使用
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;
I prefer to this variable declaration
private Class<E> entity;
And in constructor with
class
argumentpublic Dao(Class<E> clazz) { this.entity = clazz; }
这篇关于从泛型类派生的类不会获得正确的类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!