hibernate问题

问题:我通过hibernate原生sql子查询获取返回的实体list
异常:
Could not find [color=red]setter [/color]for AD_ID on class com.gtd.rocket.entity.AddressEntity
Could not find setter for AD_ID on class com.gtd.rocket.entity.AddressEntity; nested exception is org.hibernate.PropertyNotFoundException: Could not find setter for AD_ID on class com.gtd.rocket.entity.AddressEntity
分析:实体已经有setter方法
@Id
@GeneratedValue
@Column(name = "ad_id", unique = true, nullable = true)
public int getAd_id()
{
return ad_id;
}
public void setAd_id(int ad_id)
{
this.ad_id = ad_id;
}
sql查询:
String sql = "select * from a_address where ad_id in(:ids) order by ad_id";
Map> params = new HashMap>();
params.put("ids", idlist);

public List executeListBySql(final boolean transformer, final String queryString, final Map values)
{
return getHibernateTemplate().executeFind(new HibernateCallback()
{

        public Object doInHibernate(Session session) throws HibernateException, SQLException
        {
            Query query = session.createSQLQuery(queryString);
            if (transformer)
            {
                query.setResultTransformer(Transformers.aliasToBean(entityClass));
            }
            if (values != null && values.size() > 0)
            {
                query.setProperties(values);
            }
            List list = query.list();
            return list;
        }
    });
}

1个回答

官网上有解释

Could not find setter for AD_ID 即因为如使用oracle默认不区分大小写,而且它没有把你的EntityClass识别为Entity所以无法转换为property,所以默认就调用setAD_ID;
1、调用如下 告诉hibernate我是个Entity
sess.createSQLQuery("SELECT {cat.*} FROM CATS c, CATS m WHERE c.MOTHER_ID = c.ID")
.addEntity("cat", Cat.class)

3、 select A_ID as "a_id" 如果是mysql 使用a_id 告诉hibernate 真正的属性名 区分大小写的

jinnianshilongnian
jinnianshilongnian 1、select {adr.*} from a_address adr where adr.ad_id in(:ids) order by adr.ad_id 2、query.addEntity("cat", entityClass) 3、删除query.setResultTransformer(Transformers.aliasToBean(entityClass));
6 年多之前 回复
jsjgelei
jsjgelei 我改成select adr.* from a_address adr where adr.ad_id in(:ids) order by adr.ad_id还是报Could not find setter for AD_ID
6 年多之前 回复
jinnianshilongnian
jinnianshilongnian 你这个实体 hibernate没把它当成实体, 如果想当成实体你需要按照我说的【2】执行
6 年多之前 回复
jsjgelei
jsjgelei 我debug的时候看到这个EntityClass已经是转成我要的实体了
6 年多之前 回复
jinnianshilongnian
jinnianshilongnian 跟子查询无关,因为查到结果了 是赋值的时候出问题了
6 年多之前 回复
jsjgelei
jsjgelei 是不是子查询的问题呢?
6 年多之前 回复
jinnianshilongnian
jinnianshilongnian 估计你用mysql时 使用的如字段名 定义的表字段 所以是区分大小写的 而oracle 默认是不区分大小的,造成的这个问题: 1、起个别名:如 A_D as "a_d" 加双引号表示区分大小写 2、addEntity 告诉hibernate是哪个entity 这样查出来的自动是实体 3、你只使用Transformers.aliasToBean(entityClass) 只是表示得到的值是自动根据名字赋值到VO中,可以是一个实体也可以是任何非实体
6 年多之前 回复
jsjgelei
jsjgelei protected Class<T> entityClass; public GenericHibernateDao() { this.entityClass = ReflectionUtils.getSuperClassGenricType(getClass()); }
6 年多之前 回复
jsjgelei
jsjgelei 我的EntityClass通过反射已经转化为Entity了
6 年多之前 回复
jsjgelei
jsjgelei 是用的oracle 以前用的mysql没有问题,现在换成oracle出现问题了
6 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!