2012-05-28 20 views
5

Anteriormente solo había utilizado la función de reflexión para hacer cosas como obtener dinámicamente la clase y establecer valores de campo en ella. ¿Mi búsqueda en Google me mostró que posiblemente también podría usar la reflexión para el fundido de tipo dinámico?Lista dinámicamente establecida <type>

Mi código es el siguiente:

import entity.Shipvia; 
import entity.Route; 
import java.lang.reflect.Field; 
import java.util.List; 
import javax.persistence.EntityManager; 
import javax.persistence.Persistence; 
import javax.persistence.Query; 

public class RetrieveResultList { 

    public static List retrieveResultList(String tablename) { 
     EntityManager entityManager = Persistence.createEntityManagerFactory("EntityLibraryPU").createEntityManager(); 
     Query query = entityManager.createNamedQuery(tablename + ".findAll"); 
     List<Shipvia> resultList = query.getResultList(); 
     return resultList; 
    } 
} 

estoy usando este método para recuperar dinámicamente resultado de una tabla de base de datos. Como el nombre de la tabla siempre es diferente, no puedo tener una lista, ya que será diferente para cada tabla.

¿Qué debo hacer para convertir la cadena de nombre de tabla que estoy ingresando, para que sea del tipo de la lista?

Respuesta

5

No se puede hacer eso e incluso si se pudiera, sería inútil ya que toda la información genérica se elimina del código de Java cuando se compila, solo aparecerían los moldes y como se estaría utilizando la reflexión no habría moldes a hacer.

Lo más parecido que será capaz de hacer es, en lugar de enviar una cadenaenviar un objeto Clase. El código de la persona que llama debería decir qué clase quiere (la persona que llama probablemente sepa qué tipo de objeto está utilizando) y la usaría para hacer que la lista tenga el genérico correcto.

Una aplicación muy simple sería algo como esto:

List<Shipvia> shipvias = RetrieveResultList.retrieveResultList(Shipvia.class); 

y ejecución podría ser algo como esto:

public class RetrieveResultList { 

    private static final EntityManagerFactory FACTORY = Persistence.createEntityManagerFactory("EntityLibraryPU"); 

    public static <T> List<T> retrieveResultList(Class<T> type) { 
     EntityManager entityManager = FACTORY.createEntityManager(); 
     String tablename = type.getName(); // figure out table name from **type** 
     Query query = entityManager.createNamedQuery(tablename + ".findAll"); 
     List<T> resultList = query.getResultList(); 
     entityManager.close(); 
     return resultList; 
    } 
} 

Y entonces usted debe tener algo como lo que estás buscando.

TAMBIÉN, cree una fábrica de administrador de entidades en cada llamada a este método, la fábrica del administrador de entidades DEBE SER un singleton en su proyecto, ya que es un objeto muy caro crear. También debe cerrar el EntityManager que creó antes de abandonar el método.