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);
} 展开
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);
} 展开
6个回答
展开全部
兄弟,你给的分实在是太少,但是考虑到你可能急用,所以给你详解如下:
示例:按照你的思路:写一个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
示例:按照你的思路:写一个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
展开全部
你应该用 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吧
如果复制查询没办法用了session.createSQLQuery("select ***")..那这个和普通jdbc查询没啥区别了。。返回的query。。再List<Map> list = query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();
再拿list的map.get("ID") 拿字段的值。。自己封装javeBean吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你查的应该是几个字段。
这样的话你可以在实体Bean中写一个你要查找的那几个字段的构造函数。
查询的时候可以这样写
select new 实体Bean(a.实体Bean的属性,a.实体Bean的属性) form 实体Bean as a
试试看 不知道在问
这样的话你可以在实体Bean中写一个你要查找的那几个字段的构造函数。
查询的时候可以这样写
select new 实体Bean(a.实体Bean的属性,a.实体Bean的属性) form 实体Bean as a
试试看 不知道在问
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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出来多好。
String sql = "from Trade t where t.parent =" +t.tradeID;
return (Trade)this.find(sql);
}
如果你是 有个Trade 实体类 那么通过他的id查的话 就这样子 查出来的是一条记录就是一个实体的值 因为id唯一。
这样的话其实很好 你取的时候想去什么都行只不过get罢了 没必要非得只查到那个2个字段,都查了 想要那个get出来多好。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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”?
====================================
你select的只是bean中的某几个属性,强转到bean当然要报错
你select后面把所有的属性都放进去,强转应该就不报错了。
不过如果这样的话,和
String sql ="from Trade t where t.parent = '"+tradeID+"'";
就没区别了
==========
你为什么一定要用“select”?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询