Buscar
Social
Ofertas laborales ES

Foro sobre Java EE > Funciones agregadas con hibernate

Buenas tardes, me estoy volviendo loco, no consigo que me funcione algo tan sencillo como esto: List l = sesion.createQuery("select max(id) from Categorias").list();

Por supuesto List l = sesion.createQuery("select sum(*) from Categorias").list(); si que funciona.

Creó que tiene que ver con que la tabla tiene un indice compuesto, y cuando he generado los pojos me ha creado dos pojos: Categorias y CategoriasID, con el siguiente mapeo.

Categorias

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 19-ene-2012 17:12:14 by Hibernate Tools 3.2.1.GA -->
<hibernate-mapping>
<class name="pojos.Categorias" table="categorias" catalog="evalua">
<composite-id name="id" class="pojos.CategoriasId">
<key-property name="id" type="int">
<column name="id" />
</key-property>
<key-property name="padre" type="int">
<column name="padre" />
</key-property>
</composite-id>
<property name="des" type="string">
<column name="des" length="200" not-null="true" />
</property>
</class>
</hibernate-mapping>

Creo que se esta haciendo un lio con el campo ID de la tabla y con el mapeo, el error que me da es el siguiente:

GRAVE: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' categorias0_.padre) as col_0_0_ from evalua.categorias categorias0_' at line 1

Alguien tiene una consulta por medio de hibernate usando funciones agregadas que no sea "count(*)" sobre una tabla con indices compuestos y le funciona?

Muchas gracias

enero 20, 2012 | Unregistered CommenterSergio

Saaaludos.

Prueba con :

sesion.createQuery("select max(Categorias.id) from Categorias").list();

o

sesion.createQuery("select max(CategoriasId) from Categorias").list();


Recuerda que si dentro del pojo hay un campo "simple" como edad, en tus consultas hql deberas hacer algo como : Pojo.edad

Pero si dentro del pojo tienes un campo que es una clase : OtroPojoId.java y dentro de esta clase hay un campo "simple" como precio, la forma para las consultas HQL cambia un poco, creo que era algo como : Pojo.OtroPojoId.precio.

Si pones el pojo ayudaria mucho.

enero 20, 2012 | Registered Commenterjrichard

Muchas gracias por la respuesta, me sigue dando error, pero estoy seguro que es algo de lo que tu dices, ya que un pojo contiene a otro pojo, he probado las posibles combinaciones que se me han ocurrido tales como:

List l = sesion.createQuery("select max(id) from Categorias.CategoriasId").list();
List l = sesion.createQuery("select max(CategoriasId.id) from Categorias").list();
List l = sesion.createQuery("select max(Categorias.CategoriasId.id) from Categorias").list();

Las dos ultimas me dan el mismo error, el siguiente:

Unable to resolve path [Categorias.CategoriasId], unexpected token [Categorias] [select max(Categorias.CategoriasId.id) from pojos.Categorias].

Pero estoy seguro que es una combinacion parecida, ya que un pojo se encuentra dentro de otro, te adjunto los pojos.

El caso es que cuando hago una select * from Categorias, si que me encuentra todos los campos, el problema es con las funciones agregadas.

Te agradezco mucho que me eches una mano, pues tengo un proyecto parado por esto, y estoy seguro que es una tonteria.

*********************************POJO CATEGORIAS**************************************


package pojos;
// Generated 19-ene-2012 17:12:13 by Hibernate Tools 3.2.1.GA

/**
* Categorias generated by hbm2java
*/
public class Categorias implements java.io.Serializable {


private CategoriasId id;
private String des;

public Categorias() {
}

public Categorias(CategoriasId id, String des) {
this.id = id;
this.des = des;
}

public CategoriasId getId() {
return this.id;
}

public void setId(CategoriasId id) {
this.id = id;
}
public String getDes() {
return this.des;
}

public void setDes(String des) {
this.des = des;
}

}

*********************************POJO CATEGORIASID**************************************

package pojos;
// Generated 19-ene-2012 17:12:13 by Hibernate Tools 3.2.1.GA

/**
* CategoriasId generated by hbm2java
*/
public class CategoriasId implements java.io.Serializable {


private int id;
private int padre;

public CategoriasId() {
}

public CategoriasId(int id, int padre) {
this.id = id;
this.padre = padre;
}

public int getId() {
return this.id;
}

public void setId(int id) {
this.id = id;
}
public int getPadre() {
return this.padre;
}

public void setPadre(int padre) {
this.padre = padre;
}


public boolean equals(Object other) {
if ( (this == other ) ) return true;
if ( (other == null ) ) return false;
if ( !(other instanceof CategoriasId) ) return false;
CategoriasId castOther = ( CategoriasId ) other;

return (this.getId()==castOther.getId())
&& (this.getPadre()==castOther.getPadre());
}

public int hashCode() {
int result = 17;

result = 37 * result + this.getId();
result = 37 * result + this.getPadre();
return result;
}

}

enero 25, 2012 | Unregistered CommenterSergio

Me contesto a mí mismo, la solucion es poner:

"select sum(id.id) from pojos.Categorias"

Y esto es porque en el pojo Categorias, la variable "id" es de tipo CategoriasId es decir es compuesta, al decirle "id.id" realmente le estamos diciendo que nos saque el dato "id" dentro de CategoriasId.

Gracias a Richard, sin sus indicaciones no habria podido encontrar la solucion al problema.

enero 25, 2012 | Unregistered CommenterSergio

Tengo el mismo problema que has tenido pero intento ejecutar por todas las formas y me da errores:
package clasesjava;
public class Empleado implements java.io.Serializable {
private EmpleadoId id;
private String nombre;
private String apellidos;
private String email;
private int codigoJefe;
private String puesto;
}
y el que me creo es este:
public class EmpleadoId implements java.io.Serializable {
private int codigoEmpleado;
private String dniNie;}

al ejecutar en hql:
select id.CodigoEmpleado, id.dniNie, nombre, apellidos, email, codigoJefe,puesto from Empleado.EmpleadoId

este error me sale :
org.hibernate.hql.internal.ast.QuerySyntaxException: Empleado.EmpleadoId is not mapped [select id.CodigoEmpleado, id.dniNie, nombre, apellidos, email, codigoJefe,puesto from Empleado.EmpleadoId]
at org.hibernate.hql.internal.ast.QuerySyntaxException.generateQueryException(QuerySyntaxException.java:96)
at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:120)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:234)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158)
at org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:126)
at org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:88)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:190)
at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301)
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236)
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1796)
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Empleado.EmpleadoId is not mapped
at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:189)
at org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:109)
at org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:95)
at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:331)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3633)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3522)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:706)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:562)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:299)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:247)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:278)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:206)

no que podría ser.

abril 6, 2020 | Unregistered Commenterfunaky