public List<Timu> randomFindTimu(int number,List mubanzhishidians,Leixing leixing) {
Session session = getSession();//获得Session对象   zs.kemu.id ="+"'"+kemu.getId()+"'"

String hql = "from Timu as timu where timu.zhishidian in (:mubanzhishidians) and timu.leixing.id ="+"'"+leixing.getId()+"' order by newid";
Query query = session.createQuery(hql);
query.setFirstResult(0);
query.setMaxResults(number);
query.setParameterList("mubanzhishidians", mubanzhishidians);//好像是这里有问题,List mubanzhishidians里面是对象
List list = query.list();
session.close();
return list;
}
报错org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of com.tiku.model.Zhishidian.id……
root causejava.lang.IllegalArgumentException: object is not an instance of declaring class
求助

解决方案 »

  1.   

    很明显,你的leixing这个类没有持久化
      

  2.   

    这是后台的SQL语句,看晕了
    Hibernate: select shijuan0_.id as id1_0_, shijuan0_.mubanID as mubanID1_0_, shijuan0_.shijian as shijian1_0_, shijuan0_.leixing as leixing1_0_ from xintiku.dbo.shijuan shijuan0_ where shijuan0_.id=?
    Hibernate: select muban0_.id as id16_0_, muban0_.mingtiren as mingtiren16_0_, muban0_.kemuID as kemuID16_0_, muban0_.zhuanyeID as zhuanyeID16_0_, muban0_.zongfen as zongfen16_0_, muban0_.shijian as shijian16_0_, muban0_.fenshu as fenshu16_0_, muban0_.nandu as nandu16_0_, muban0_.mingcheng as mingcheng16_0_, muban0_.leixing as leixing16_0_ from xintiku.dbo.muban muban0_ where muban0_.id=?
    Hibernate: select jiaoshi0_.id as id13_0_, jiaoshi0_.gonghao as gonghao13_0_, jiaoshi0_.xingming as xingming13_0_, jiaoshi0_.mima as mima13_0_ from xintiku.dbo.jiaoshi jiaoshi0_ where jiaoshi0_.id=?
    Hibernate: select kemu0_.id as id3_0_, kemu0_.mingcheng as mingcheng3_0_ from xintiku.dbo.kemu kemu0_ where kemu0_.id=?
    Hibernate: select zhuanye0_.id as id0_0_, zhuanye0_.mingcheng as mingcheng0_0_ from xintiku.dbo.zhuanye zhuanye0_ where zhuanye0_.id=?
    Hibernate: select muban0_.id as id16_0_, muban0_.mingtiren as mingtiren16_0_, muban0_.kemuID as kemuID16_0_, muban0_.zhuanyeID as zhuanyeID16_0_, muban0_.zongfen as zongfen16_0_, muban0_.shijian as shijian16_0_, muban0_.fenshu as fenshu16_0_, muban0_.nandu as nandu16_0_, muban0_.mingcheng as mingcheng16_0_, muban0_.leixing as leixing16_0_ from xintiku.dbo.muban muban0_ where muban0_.id=?
    Hibernate: select jiaoshi0_.id as id13_0_, jiaoshi0_.gonghao as gonghao13_0_, jiaoshi0_.xingming as xingming13_0_, jiaoshi0_.mima as mima13_0_ from xintiku.dbo.jiaoshi jiaoshi0_ where jiaoshi0_.id=?
    Hibernate: select kemu0_.id as id3_0_, kemu0_.mingcheng as mingcheng3_0_ from xintiku.dbo.kemu kemu0_ where kemu0_.id=?
    Hibernate: select zhuanye0_.id as id0_0_, zhuanye0_.mingcheng as mingcheng0_0_ from xintiku.dbo.zhuanye zhuanye0_ where zhuanye0_.id=?
    Hibernate: select mubanleixi0_.leixingID as leixingID10_, mubanleixi0_.mubanID as mubanID10_, mubanleixi0_.geshu as geshu10_, mubanleixi0_.fenzhi as fenzhi10_ from xintiku.dbo.mubanLeixing mubanleixi0_ where mubanleixi0_.mubanID='15'
    Hibernate: select mubanzhish0_.mubanID as mubanID9_, mubanzhish0_.zhishidianID as zhishidi2_9_, mubanzhish0_.maxnandu as maxnandu9_, mubanzhish0_.minnandu as minnandu9_ from xintiku.dbo.mubanZhishidian mubanzhish0_ where mubanzhish0_.mubanID='15'
    Hibernate: select top 1 timu0_.id as id14_, timu0_.zhishidianID as zhishidi2_14_, timu0_.leixingID as leixingID14_, timu0_.neirong as neirong14_, timu0_.daan as daan14_, timu0_.nandu as nandu14_, timu0_.zhukeguan as zhukeguan14_ from xintiku.dbo.timu timu0_ where (timu0_.zhishidianID in (? , ? , ? , ? , ?)) and timu0_.leixingID='1' order by newid
      

  3.   

    应该是这儿的问题
     query.setParameterList("mubanzhishidians", mubanzhishidians);//好像是这里有问题,List mubanzhishidians里面是对象
    我想知道setParameterList到 内容为对象的List里面 是什么东西,怎样能把对象传入呢?类似setEntity那样,但是setEntity只能传递一个对象,而我这里是一个对象list,需要传入多个对象整理了下SQL语句
    Hibernate: select from xintiku.dbo.jiaoshi jiaoshi0_ where jiaoshi0_.id=?
    Hibernate:  from xintiku.dbo.kemu kemu0_ where kemu0_.id=?Hibernate: select ] from xintiku.dbo.zhuanye zhuanye0_ where zhuanye0_.id=?Hibernate: select ]from xintiku.dbo.muban muban0_ where muban0_.id=?
     
     
    Hibernate: select from xintiku.dbo.jiaoshi jiaoshi0_ where jiaoshi0_.id=?Hibernate: select ] from xintiku.dbo.zhuanye zhuanye0_ where zhuanye0_.id=?Hibernate: select from xintiku.dbo.mubanLeixing mubanleixi0_ where mubanleixi0_.mubanID='15'Hibernate: select  from xintiku.dbo.mubanZhishidian mubanzhish0_ where mubanzhish0_.mubanID='15'Hibernate: select top 1 from xintiku.dbo.timu timu0_ where (timu0_.zhishidianID in (? , ? , ? , ? , ?))
      and timu0_.leixingID='1' order by newid
      

  4.   

    com.tiku.model.Zhishidian.id
    id属性没有提供get方法
      

  5.   

    括号去掉试试
    "from Timu as timu where timu.zhishidian in :mubanzhishidians and ......"
    hibernate内部解析的时候会自己加上括号
      

  6.   

    解决方法
    public List<Timu> randomFindTimu(int number,List mubanzhishidians,Leixing leixing) {
    Session session = getSession();

    /*String hql = "from Timu as timu where timu.zhishidian.id in (:mubanzhishidians) and timu.leixing.id ="+"'"+leixing.getId()+"' order by newid()";
    Query query = session.createQuery(hql);
    query.setParameterList("mubanzhishidians", mubanzhishidians);

    */


    StringBuffer sb = new StringBuffer();

    for (int i = 1; i < mubanzhishidians.size(); i++) {
    sb.append(",?");
    }
    String hql2 = "from Timu as timu where timu.zhishidian.id in (?"+ sb + ") and timu.leixing.id ="+"'"+leixing.getId()+"' order by newid()";
    Query query = session.createQuery(hql2);
    for (int i = 0; i < mubanzhishidians.size(); i++) {
    //int zhishidianid =  mubanzhishidians.get(i).getId().getMuban().getId();
    MubanZhishidian mubanZhishidian = (MubanZhishidian) mubanzhishidians.get(i);
    MubanZhishidianId mubanZhishidianId = mubanZhishidian.getId();
    Zhishidian zhishidian = mubanZhishidianId.getZhishidian();
    int zhishidianid = zhishidian.getId();
    query.setInteger(i, zhishidianid);

    }
      

  7.   

    貌似你的参数传错了,你的传递的参数是List集合吗?
    怎么能是个Sql语句的参数怎么能是个List呢?
    如果你需要集合某个值的话的遍历啊!这样穿进去。
    建议不要展位参数最好写成:from Timu as timu where timu.zhishidian.id in =?不知对否?
      

  8.   

    and timu.leixing.id ="+"'"+leixing.getId()+"' order by newid"
    如果timu.leixing.id  不是字符串,去掉+"'"+leixing.getId()+"' 上的 单引号‘‘。
      

  9.   

    基本同意5L的意见,setparameterlist其实是传入一个数组,hibernate在转换成sql的时候,会抽取list里面全部实体的主键形成主键数组,然后比较引用实体的主键(不知道你是不是用的id),是否in其中,感觉应该是你要么没有主键getter要么是有些实体的主键值为空