jueves, 26 de febrero de 2009

Spring + Hibernate + Llamadas a Stored Procedures

En un nuevo proyecto, me encontré con que sólo tengo acceso a la Base de Datos a través de llamadas a Stored Procedures y Funciones.
Como me resultó un poco tedioso, les mando un paso a paso de lo que hice:

1. Crear la llamada a la función; en este caso, una NamedNativeQuery:

@Entity
@NamedNativeQueries(value={@NamedNativeQuery( callable=true
,name="USER_PKG.fetchUsers"
,query="{ ? = call USER_PKG.fetchUsers(:code, :userName) }"
,resultClass=User.class
)}

)
public class User implements Serializable {

/**
*
*/
private static final long serialVersionUID = 1L;

@Id
private Long code;

@Column(name="nombre_usuario")
private String userName;

//Continúa el código
...

}

2. En el DAO (o lo que sea que tengan para acceder a la BD) hice lo siguiente:

...
@SuppressWarnings("unchecked")
public List fetchUsers(final long code, final String userName) {

return (List) getHibernateTemplate().execute(new HibernateCallback() {

public Object doInHibernate(final Session session) throws HibernateException, SQLException {

Query query = session.getNamedQuery("USER_PKG.fetchUsers");

query.setParameter("code", code)
.setParameter("userName", userName);

return query.list();
}
});
}
...

3. Finalmente, un caso de prueba para cerrar el ciclo:

...
public void testFetchUsers() {
Long code = new Long(10);
List queryResult = dao.fetchUsers(code, "yo");

for (User user : queryResult) {
assertEquals(code,user.getCode());
}

}
...

Espero que sirva de algo. Yo estuve un rato largo para hacerlo andar =P.

No hay comentarios.:

Publicar un comentario