hibernate根据多属性查询报错:unexpected char :‘@’

解决SSH框架中hibernate根据多属性查询数据库报错:unexpected char :‘@’

问题描述

使用myeclipse工具对数据表进行逆向工程生成的DAO类中会有一个findByProperty方法:
    public List findByProperty(String propertyName, Object value) {
        log.debug("finding StudentCheck instance with property: "
                + propertyName + ", value: " + value);
        try {
            String queryString = "from StudentCheck as model where model."
                    + propertyName + "= ?";
            return getHibernateTemplate().find(queryString, value);
        } catch (RuntimeException re) {
            log.error("find by property name failed", re);
            throw re;
        }
    }

该方法只适用于单属性查询,当我们需要通过多个属性查询时,如果自己编写以下方法:

    public List findByProperty(String propertyName[], Object value[]){
        try {           
            String sql = "from StudentCheck as model where";
            for(int i = 0; i < propertyName.length ; i++){
                if(i == 0){
                    sql += " model." + propertyName[i] + "=" + value[i];
                }else{
                    sql += " and model." + propertyName[i] + "=" + value[i];
                }
            }
            return getHibernateTemplate().find(sql);
        } catch (RuntimeException re) {
            // TODO: handle exception
            log.error("find by property name failed", re);
            throw re;
        }
    }

这时,如果数据表是关联有外键的,调用多属性查询的办法时传入的参数是外键对应的表的一个对象,运行就会报错,错误信息如标题所示。

解决办法

此时查看hibernate文档,发现find方法还有其他形式,利用其他形式的find的函数,将多属性查询办法修改成如下形式:

    public List findByProperty(String propertyName[], Object value[]){
        try {           
            String sql = "from StudentCheck as model where";
            for(int i = 0; i < propertyName.length ; i++){
                if(i == 0){
                    sql += " model." + propertyName[i] + "=?";
                }else{
                    sql += " and model." + propertyName[i] + "=?";
                }
            }
            return getHibernateTemplate().find(sql,value);
        } catch (RuntimeException re) {
            // TODO: handle exception
            log.error("find by property name failed", re);
            throw re;
        }
    }

当根据对象查询时,应该采用上面这种插入占位符”?“,然后使用find(sql,value)方法。

你可能感兴趣的:(hibernate)