2013-02-27 60 views
0

即时做我的第一次尝试在休眠,我得到这个问题。冬眠奇怪的错误在咨询

当我这样做咨询,我得到正确的结果

List result = session.createQuery("select t from Tarea t where t.subtipo = 1").list(); 

但如果我用一个参数给我一个错误

List result = session.createQuery("select t from Tarea t where t.subtipo = :subtipo"). 
      setParameter("subtipo", 1).list(); 

的错误是:

ERROR org.hibernate.property.BasicPropertyAccessor - IllegalArgumentException in class: com.hibernate.gip.modelo.SubTipo, getter method of property: id_subtipo 
[ERROR] IllegalArgumentException occurred calling getter of com.hibernate.gip.modelo.SubTipo.id_subtipo 
java.lang.reflect.InvocationTargetException 

也许我忘了一些像newbe ...任何人都可以解决它? 在此先感谢!

编辑...

SubTipo.java

public class SubTipo { 

// Atributos 
private int id_subtipo; 
private String nombre; 
private Tipo tipo; 

private Set<Incidencia> incidencias = new HashSet<Incidencia>(); 
private Set<Tarea> tareas = new HashSet<Tarea>(); 

// Constructores 
public SubTipo() {} 

public SubTipo(int id, String nom, Tipo tip, Set<Tarea> tar, Set<Incidencia> inc) { 
    this.id_subtipo = id; 
    this.nombre = nom; 
    this.tipo = tip; 
    this.incidencias = inc; 
    this.tareas = tar; 
} 

// Getters & Setters 
public int getId_subtipo() { 
    return id_subtipo; 
} 

public void setId_subtipo(int id_subtipo) { 
    this.id_subtipo = id_subtipo; 
} 

public String getNombre() { 
    return nombre; 
} 

public void setNombre(String nombre) { 
    this.nombre = nombre; 
} 

public Tipo getTipo() { 
    return tipo; 
} 

public void setTipo(Tipo tipo) { 
    this.tipo = tipo; 
} 

public Set<Incidencia> getIncidencias() { 
    return incidencias; 
} 

public void setIncidencias(Set<Incidencia> incidencias) { 
    this.incidencias = incidencias; 
} 

public Set<Tarea> getTareas() { 
    return tareas; 
} 

public void setTareas(Set<Tarea> tareas) { 
    this.tareas = tareas; 
} 

} 

SubTipo映射文件

<hibernate-mapping package="com.hibernate.gip.modelo"> 

<class name="SubTipo" table="SUBTIPO"> 

    <id name="id_subtipo" type="int"> 
     <column name="ID_SUBTIPO" /> 
     <generator class="assigned" /> 
    </id> 

    <property name="nombre" type="java.lang.String"> 
     <column name="NOMBRE" /> 
    </property> 

    <many-to-one name="tipo" class="com.hibernate.gip.modelo.Tipo"> 
     <column name="TIPO" not-null="true" /> 
    </many-to-one> 

    <set name="incidencias" table="INCIDENCIA"> 
     <key> 
      <column name="SUBTIPO" /> 
     </key> 
     <one-to-many class="com.hibernate.gip.modelo.Incidencia" /> 
    </set> 

    <set name="tareas" table="TAREA"> 
     <key> 
      <column name="SUBTIPO" /> 
     </key> 
     <one-to-many class="com.hibernate.gip.modelo.Tarea" /> 
    </set> 

</class> 

</hibernate-mapping> 

其所需的其他类?感谢

重新编辑

Tarea.java

public class Tarea { 

// Atributos 
private String id_tarea; 
private String nombre; 
private int t_limite; 

private Tarea precedente; 
private SubTipo subtipo; 

private Set<iTarea> iTareas = new HashSet<iTarea>(); 

// Constructores 
public Tarea() {} 

public Tarea(String id, String nom, int lim, Tarea pre, SubTipo sub, Set<iTarea> iTa) { 
    this.id_tarea = id; 
    this.nombre = nom; 
    this.t_limite = lim; 
    this.precedente = pre; 
    this.subtipo = sub; 
    this.iTareas = iTa; 
} 

// Getters & Setters 
public String getId_tarea() { 
    return id_tarea; 
} 

public void setId_tarea(String id_tarea) { 
    this.id_tarea = id_tarea; 
} 

public String getNombre() { 
    return nombre; 
} 

public void setNombre(String nombre) { 
    this.nombre = nombre; 
} 

public int getT_limite() { 
    return t_limite; 
} 

public void setT_limite(int t_limite) { 
    this.t_limite = t_limite; 
} 

public Tarea getPrecedente() { 
    return precedente; 
} 

public void setPrecedente(Tarea precedente) { 
    this.precedente = precedente; 
} 

public SubTipo getSubtipo() { 
    return subtipo; 
} 

public void setSubtipo(SubTipo subtipo) { 
    this.subtipo = subtipo; 
} 

public Set<iTarea> getiTareas() { 
    return iTareas; 
} 

public void setiTareas(Set<iTarea> iTareas) { 
    this.iTareas = iTareas; 
} 

} 

利亚映射

<hibernate-mapping package="com.hibernate.gip.modelo"> 

<class name="Tarea" table="TAREA"> 

    <id name="id_tarea" type="java.lang.String"> 
     <column name="ID_TAREA" /> 
     <generator class="assigned" /> 
    </id> 

    <property name="nombre" type="java.lang.String"> 
     <column name="NOMBRE" /> 
    </property> 

    <property name="t_limite" type="int"> 
     <column name="T_LIMITE" /> 
    </property> 

    <many-to-one name="precedente" class="com.hibernate.gip.modelo.Tarea" unique="true"> </many-to-one> 

    <many-to-one name="subtipo" class="com.hibernate.gip.modelo.SubTipo"> 
     <column name="SUBTIPO" not-null="true"/> 
    </many-to-one> 

    <set name="iTareas" table="ITAREA"> 
     <key> 
      <column name="TAREA" /> 
     </key> 
     <one-to-many class="com.hibernate.gip.modelo.iTarea" /> 
    </set> 

</class> 

</hibernate-mapping> 
+0

请发布您的实体的代码,因为您的错误似乎来自他们。 Subtypo.id的类型是什么? – benzonico 2013-02-27 20:44:02

+0

编辑,谢谢你的时间 – r1k4r2 2013-02-27 20:50:59

+0

你也应该添加Tarea类。 – benzonico 2013-02-27 20:53:52

回答

0

当你在HQL工作,不要忘记你正在处理的对象,而不是一行。

您在查询中传递的参数是id而不是对象。 你可以试试:如果您传递给它的subtipo一个persited实例,而不是一个ID

List result = session.createQuery("select t from Tarea t where t.subtipo.id_subtipo = :subtipoId").setParameter("subtipoId", 1).list(); 

您尝试的查询可能会奏效。

+0

它解决了我的问题,谢谢你的帮助。我确实喜欢你告诉我,在参数和工作中使用了subtipo对象=) – r1k4r2 2013-02-27 23:01:33