在hql中使用WHERE子句和实例

时间:2014-06-20 07:36:22

标签: hql

如何使用WHERE子句从表中选择记录并比较实例(患者)

    public History findHistory(Patient patient) { History model=null;
    Session sesion=util.HibernateUtil.getSessionFactory().getCurrentSession();
    String sql="FROM History h WHERE h.patients=" + patient;

    try{
        sesion.beginTransaction();
        model=(History) sesion.createQuery(sql).uniqueResult();

        sesion.beginTransaction().commit();

    }
    catch(Exception e){
        sesion.beginTransaction().rollback();
    }
    return model;
}

抛出queryException#1562 e.queryString =" FROM entidad.Historia h WHERE h.pacientes=entidad.Paciente@3ad3a221" e.detailMessage ="意外的字符:' @'"

1 个答案:

答案 0 :(得分:1)

您的代码的问题在于,像您一样连接患者只会附加patient.toString(),在您的情况下是默认实现(即classname @ hashcode),Hibernate无法找出哪些数据在DB中检索。

首先需要绑定参数:

String sql = "FROM History h WHERE h.patients = :patient";

然后

model = (History) sesion.createQuery(sql)
            .setParameter("patient", patient)
            .uniqueResult();

修改

SQLGrammarException:无法执行查询可能因各种原因发生。尝试在SqlDeveloper(或任何其他工具)中运行生成的查询,并查看数据库所说的内容。在您的情况下,最后一部分and .=?会导致错误。 cross join也是Harming。我怀疑你的映射是不完整的,Hibernate无法找到如何加入历史和病人。尝试在历史实体中添加这样的内容:

@ManyToOne
@JoinColumn(name = "patient")
private Patient patient;