[main] ERROR org.hibernate.hql.PARSER - <AST>:0:0: unexpected AST node: query
[main] ERROR org.hibernate.hql.PARSER - <AST>:0:0: unexpected AST node: query
En cualquier modo en que se presente, sabemos que intentamos mandar a ejecutar una consulta personalizada y compleja, puede ser una consulta anidada u otra donde se haga uso de sentencias nativas SQL del gestor de Base de Datos que estemos usando (PostgreSQL, MySQL, DB2, ...otro).
Solo como datos, Hibernate trabaja Consultas a Base de Datos en dos formas, haciendo uso de su lenguaje HQL y del API de Criteria, éste último mediante el uso de Example. Entonces, partiendo del mensaje del error, "org.hibernate.hql.PARSER".
Este error se da por que se intenta ejecutar un tipo de consulta con lenguaje nativo SQL, pasando como parámetro la Consulta en un tipo String, ésta consulta HQL no lo reconocerá y es cuando lanza el Error. Debido a que HQL solo consta de Consultas Mínimas y Generales para cualquier gestor de BD.
Para poder hacer éstas consultas hay dos formas, haciendo uso de HQL, y solicitando la consulta como un Query normal del Gestor:
Primer Modo, haciendo uso de la Clase HibenateUtil, quien hace la gestion de las Transacciones en la Sesion, indicadas por el usuario:
Session session = HibernateUtil.getSession();
session = HibernateUtil.beginTransaction();
Direccion direccion = (Direccion) session.createQuery("from Direccion where id>4 and numero='520'").uniqueResult();
session.beginTransaction().commit();
Se puede personalizar el tipo de Dato a Esperar desde un Object a uno en Específico, También definir si son Objetos Únicos o Listas. Por ejemplo:
List<Autor> autores = session.createQuery("from Autor where id>1 and nombre like 'Juan'").list();
Y si tienes que Ejecutar una consulta compleja que HQL no te reconoce a modo básico, solo basta indicarla con createSQLQuery:
Session session = HibernateUtil.getSession();
session = HibernateUtil.beginTransaction();
List<Direccion> direcciones = (List<Direccion>) session.createSQLQuery("query").list();
session.beginTransaction().commit();
En Segundo Modo. donde se presentó el error, es bajo el Framework Spring y trabajando con Hibernate, considerando que obtendremos un listado pero de un objeto no de tipo directo de nuestros Beans, sino una mezcla de ellos, esperarlos como Objects.
Session session = (Session) getSession();
session.createSQLQuery(query);
List<Object[]> lst = (List<Object[]>) session.createSQLQuery("query").list();
session.beginTransaction().commit();
0 comments:
Post a Comment