2012-01-31 16 views
57

Estoy usando Hibernate 4 y me gustaría simplemente enumerar todas las filas de una tabla. Todas las soluciones que encontré sugieren usar algo como "desde el nombre de la tabla", pero me gustaría evitar las codificaciones de los nombres de tablas en cadenas.Recuperando todas las filas de una tabla sin HQL?

Respuesta

130

Puede utilizar

session.createCriteria(MyEntity.class).list(); 

por ejemplo.

+1

¿Cómo podría ordenar esto? –

+14

session.createCriteria (MyEntity.class) .addOrder (Order.asc ("age")). List(); – slonik

+5

¿Hay alguna forma de hacer que este tipo sea seguro? – Hassan

7

HQL no utiliza nombres de tablas. Utiliza nombres de entidades. Y los nombres de las entidades son (por defecto) nombres de clase. Así que usted puede utilizar

String hql = "select a from " + TheEntity.class.getSimpleName() + " a"; 

Pero yo estaría a favor de la lectura sobre la seguridad de tipos aquí, y utilizar pruebas

String hql = "select a from TheEntity a"; 

Debería haber automatizados para las consultas de todos modos.

+0

Sí, las consultas se ponen a prueba, pero su segunda solución seguiría significando que la consulta no sería tomada en cuenta por la refactorización . –

+1

Sí, pero sería atrapado por una prueba de falla. –

+0

Estoy de acuerdo en que, al final, es importante obtener resultados correctos, pero como el proyecto se encuentra actualmente en etapas iniciales, ocurre algún tipo de refactorización cada semana. Por lo tanto, apoyar adecuadamente esto es bastante vital en este momento. –

-2

// Hibernate Clase

public class CommonDAO<T> { 

Session session = null; 
Transaction transaction = null; 
private Class<T> clazz; 

public CommonDAO(){ //constructor 
    session = HibernateUtil.getSessionFactory().openSession(); 
    transaction = session.beginTransaction(); 
    Type genericSuperclass = this.getClass().getGenericSuperclass(); 
    if (genericSuperclass instanceof ParameterizedType) { 
     ParameterizedType pt = (ParameterizedType) genericSuperclass; 
     Type type = pt.getActualTypeArguments()[0]; 
     clazz = (Class<T>) type; 
    } 
} 

public T listById(Object id) { 
    T object = null; 
    try { 
    object = (T) session.get(clazz, (Serializable) id); 
    } catch (Exception e) { 
    e.printStackTrace(); 
    } 
    return object; 
} 
} 

// El usuario Clase

public class UserDAO extends CommonDAO<UserMaster> { // Here UserMaster is pojo 

public UserDAO() { 
    super(); 
} 

public static void main(String ar[]) { 
    UserMaster user = new UserDAO().listById(1); // 1 is id 
    System.out.println(user.getUserName()); 
} 
} 
+2

No haga nada de eso con la sesión en los constructores – dikkini

+0

Usando la sesión en constructores !!! en absoluto buenas prácticas .. – Krishna

+2

@dikkini ¿Por qué es así? ¿Puedes explicarme eso? –

Cuestiones relacionadas