2011-09-16 17 views
8

Esto está en mi DAO:Seleccionar solo elemento de la base de datos con Spring Hibernate SessionFactory

public List<Weather> getCurrentWeather() { 
    return sessionFactory.getCurrentSession().createQuery("from Weather").list(); 
} 

esto se pone todos los elementos de la tabla de tiempo. Pero digamos que lo que quiero hacer algo como esto (yo quiero un solo elemento de la tabla de Tiempo):

public Weather getCurrentWeather() {  
    return sessionFactory.getCurrentSession().createQuery("from Weather where id = 1").list(); // here should be something else than list() 
} 

Sé que no debería haberlist()al final, pero ¿qué debo escribir allí, para conseguir solo un objeto?

Respuesta

11

Si usted tiene un id, que sólo tiene que utilizar conseguir:

public Weather getCurrentWeather() {  
    return sessionFactory.getCurrentSession().get(Weather.class, 1); 
} 

Si necesita hacer una consulta, sí que tendrá que agarrar la parte superior del conjunto de resultados, o puede utilizar uniqueResult() en la consulta.

+1

uniqueResult() es un objeto, ¿cómo manejar la diferencia de tiempo y el objeto normal? ¿Debería lanzarlo maníacamente al clima? O hay una forma más adecuada? – Jaanus

+2

Sí, lo lanzaste. No hay tal cosa como seguridad de tipo de tiempo de compilación con consultas. ¿Cómo se supone que el compilador sabe lo que creará su declaración HQL al final? – Affe

+0

Pero, ¿funciona esto cuando tengo algo más que ID, por ejemplo, un campo entero? – Jaanus

7

¿Hay algún error al obtener una lista? :) Incluso si sabes que solo hay 1 hibernación, no puedes asumir eso. ¡Obtener una lista es más seguro de todos modos!

public Weather getCurrentWeather() {  
    List<Weather> list = sessionFactory.getCurrentSession().createQuery("from Weather where id = 1").list(); // here should be something else than list() 
    return (list.isEmpty() ? null : list.get(0)); 
} 
+0

Sí, pensé en conseguir una lista, pero pensé si es otra forma también Sin embargo, ¿debo manejar el cambio de List to Weather en DAO como lo hizo, o simplemente manejarlo en mi opinión, obteniendo el primer elemento de la lista allí? ¿Cuál sería el uso correcto? – Jaanus

+0

Bueno, depende de usted, pero a menos que desee que las listas vuelvan a su vista todo el tiempo, lo haría en el nivel DAO. Además, el nombre del método sugiere que solo quieres el clima actual para que otras personas que usen tu código puedan confundirse sobre por qué se devuelve una lista. –

0

Es necesario utilizar la API Criterios de la siguiente manera:

List<LeaveManagement> leaveManagements =  session.createCriteria(LeaveManagement.class) 
      .add(Restrictions.isNull("approvedTimeStamp")) 
      .list(); 

    If you want to write a hql query you can write as: 

    String hql = "from LeaveManagement where approvedTimeStamp is null"; 
     Query query = session.createQuery(hql); 
     List results = query.list(); 
Cuestiones relacionadas