hibernate的hql中,不写select会有区别吗

我发现使用select的语句返回的是个单纯的数组,不能被转换为bean对象,强转出错,尔不写select的返回结果是个可以被转换的数组,不知道大家有没有碰到这种问题??,... 我发现使用select的语句返回的是个单纯的数组,不能被转换为bean对象,强转出错,尔不写select的返回结果是个可以被转换的数组,不知道大家有没有碰到这种问题??,怎么样才能让写了select的hql返回的对象可以被转换为bean对象呢???
huangpeng0419 同学说的我已经试过了,还是不行,返回的就是个数组,不能转bean
代码狠简单,我用的是spring的hibernate的模板。
public List findSmallTrade(Integer tradeID) {
String sql = "select t.trade,t.parent from Trade t where t.parent = '"+tradeID+"'";
return this.find(sql);
}

public List find(String sql ){
return this.getHibernateTemplate().find(sql);

}
展开
 我来答
dzvid2003
2009-10-16 · TA获得超过708个赞
知道答主
回答量:130
采纳率:0%
帮助的人:59.5万
展开全部
兄弟,你给的分实在是太少,但是考虑到你可能急用,所以给你详解如下:
示例:按照你的思路:写一个java bean(省略掉了setter,getter方法)
public class Man
{
private int id;
private String name;
private int age;
private String wife;
private String address;

public Man()
{

}
}
类Man有四种属性:id,name,age,wife,address,其中还包含一个空的构造方法。
(1)在什么情况下,不用写select
当我们查询的是Man的所有属性时,我们可以不写select。如:from Man;当然也可以写,但格式要发生改变:select m from Man (as) m;括号中的as可写可不写。
(2)在什么情况下,写select
当我们查询的不再是Man的所有属性是,我们必须要写上select。如:我们查询Man中的name和age属性时,我们必须这么写:select s.name,s.age from Man s;也可以不用别名:select name,age from Man;
(3)写与不写的区别
当我们查询的对象属性超过一个时,Hibernate所返回的查询结果集是Object[]对象数组。如:List result=session.createQuery("select name,age from Man").list();
Iterator iter=result.iterator();
while(iter.hasNext())
{
Object[] row=(Object[])iter.next();//取出一行记录,其中包含name,age两列。
System.out.println("Result is:"+row[0]+","+row[1]);
//其中row[0]就是查询语句中涉及的第一个属性name,row[1]就是第二个属性age。
}
这时,就要涉及到你所说的第二个问题了,如何将我们查询返回的Object[]数组对象转变成我们先前创建的java bean即Man对象哪,很简单,在Man类中,构建一个新的带参数的构造方法:
public Man(String name,int age)
{
this.setName(name);
this.setAge(age);
}
参考下面的select语句,你就明白为什么写这两个参数了。
这样,我们就可以直接使用了,如下:(为了你的理解,我使用了泛型)
List<Man> result=session.createQuery("select name,age from Man").list();
Iterator<Man> iter=result.iterator();
while(iter.hasNext())
{
Man man=(Man)iter.next();
System.out.println("Result is:"+man.getName()+","+man.getAge());
}
上述方法的输出是一样的。当然了,如果更加严格一点,上面的select语句可写为:
select new Man(name,age) from Man
百度网友dc81944bb
2009-10-16 · TA获得超过572个赞
知道小有建树答主
回答量:793
采纳率:0%
帮助的人:723万
展开全部
你应该用 session.createQuery("from bean where *******");这样子。。bean就是hibernate配的javabean
如果复制查询没办法用了session.createSQLQuery("select ***")..那这个和普通jdbc查询没啥区别了。。返回的query。。再List<Map> list = query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();
再拿list的map.get("ID") 拿字段的值。。自己封装javeBean吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
huangpeng0419
2009-10-16 · TA获得超过357个赞
知道小有建树答主
回答量:569
采纳率:100%
帮助的人:298万
展开全部
你查的应该是几个字段。
这样的话你可以在实体Bean中写一个你要查找的那几个字段的构造函数。

查询的时候可以这样写
select new 实体Bean(a.实体Bean的属性,a.实体Bean的属性) form 实体Bean as a

试试看 不知道在问
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tiancaihuli5
2009-10-19 · TA获得超过2411个赞
知道答主
回答量:102
采纳率:0%
帮助的人:115万
展开全部
public Trade findSmallTrade(Trade t) {
String sql = "from Trade t where t.parent =" +t.tradeID;
return (Trade)this.find(sql);
}
如果你是 有个Trade 实体类 那么通过他的id查的话 就这样子 查出来的是一条记录就是一个实体的值 因为id唯一。
这样的话其实很好 你取的时候想去什么都行只不过get罢了 没必要非得只查到那个2个字段,都查了 想要那个get出来多好。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
咖悟怀8558
2009-10-16 · TA获得超过277个赞
知道小有建树答主
回答量:299
采纳率:0%
帮助的人:189万
展开全部
String sql = "select t.trade,t.parent from Trade t where t.parent = '"+tradeID+"'";

====================================

你select的只是bean中的某几个属性,强转到bean当然要报错

你select后面把所有的属性都放进去,强转应该就不报错了。
不过如果这样的话,和
String sql ="from Trade t where t.parent = '"+tradeID+"'";
就没区别了

==========

你为什么一定要用“select”?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式