当前位置:编程学习 > JAVA >>

一个HQL语句,不知错在哪里,求指教

	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 cause

java.lang.IllegalArgumentException: object is not an instance of declaring class
求助 --------------------编程问答-------------------- 很明显,你的leixing这个类没有持久化 --------------------编程问答-------------------- 这是后台的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
--------------------编程问答--------------------
引用 1 楼 doren 的回复:
很明显,你的leixing这个类没有持久化

谢谢回复,有什么解决办法吗 --------------------编程问答-------------------- 应该是这儿的问题
 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


--------------------编程问答-------------------- com.tiku.model.Zhishidian.id
id属性没有提供get方法 --------------------编程问答-------------------- 或者你的参数和你的数据类型不匹配 --------------------编程问答-------------------- 实体写的有问题吧 --------------------编程问答-------------------- 括号去掉试试
"from Timu as timu where timu.zhishidian in :mubanzhishidians and ......"

hibernate内部解析的时候会自己加上括号 --------------------编程问答--------------------
引用 6 楼 xieyongcx 的回复:
或者你的参数和你的数据类型不匹配


引用 7 楼 Gsyd320 的回复:
实体写的有问题吧


引用 8 楼 whos2002110 的回复:
括号去掉试试
"from Timu as timu where timu.zhishidian in :mubanzhishidians and ......"

hibernate内部解析的时候会自己加上括号

换了种方法,成功了,基本证实问题是我在四楼描述的那样。但我还想知道我在四楼里问题的答案 --------------------编程问答-------------------- 解决方法
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);

}
--------------------编程问答-------------------- 跪求我在四楼里问题的答案 --------------------编程问答-------------------- 貌似你的参数传错了,你的传递的参数是List集合吗?
怎么能是个Sql语句的参数怎么能是个List呢?
如果你需要集合某个值的话的遍历啊!这样穿进去。
建议不要展位参数

最好写成:from Timu as timu where timu.zhishidian.id in =?

不知对否?
--------------------编程问答-------------------- and timu.leixing.id ="+"'"+leixing.getId()+"' order by newid"
如果timu.leixing.id  不是字符串,去掉+"'"+leixing.getId()+"' 上的 单引号‘‘。 --------------------编程问答--------------------
引用 5 楼 xieyongcx 的回复:
com.tiku.model.Zhishidian.id
id属性没有提供get方法

基本同意5L的意见,setparameterlist其实是传入一个数组,hibernate在转换成sql的时候,会抽取list里面全部实体的主键形成主键数组,然后比较引用实体的主键(不知道你是不是用的id),是否in其中,感觉应该是你要么没有主键getter要么是有些实体的主键值为空
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,