在hibernate中,用hql语句查询实体类,采用list方法的返回结果为一个List,该List中封装的对象分为以下三种情况:
1.查询全部字段的情况下,如"from 实体类",list中封装的对象为实体类本身,各属性都将得到填充。
2.只查询一个字段,默认情况下,list中封装的是Object对象。
3.查询两个或两个以上的字段,默认情况下,list中封装的是Object[],长度与所查询的字段数一致。
对于后两种情况,用标签遍历时不太方便,因为无法直接转换成实体类的对象。比较简单的解决方法是:
1:在hql中使用select new 包名.类名(属性1,属性2……) from 实体类,同时在实体类中添加带参的构造方法,参数的个数和顺序与(属性1,属性2……) 保持一致,这样我们得到的list中存放的依然是实体类的对象,所查询到的属性得到了填充,使用起来更为方便。
2:hql查询多表部分字段,select new 包名.表1实体类名(表1.属性1,表2.属性2……) from 表1实体类,表2实体类 where 表1.ID=表2.ID(即相关联的字段),同时在要返回的表1实体类中添加表2的属性和带参的构造方法,参数的个数和顺序与(表1.属性1,表2.属性 2……) 保持一致
例如要查询Problem 中的pid,score,title,totalAccept,totalSubmission,unSee
参考链接:
1、在HotNews的bean实体中,添加上一个构造函数,此构造函数的参数为:热点医讯ID、标题、简介、发布时间、Banner图片地址。参数内容对应了首页的导航板块所需要应用到的字段名称。如下图所示:
public HotNews(Integer hotNewsId,String title,String synopsis,Object publishingTime,String bannerAddress){
this.hotNewsId = hotNewsId;
this.title = title;
this.synopsis = synopsis;
this.publishingTime = DateUtil.formatTime(publishingTime);
this.bannerAddress = bannerAddress;
}
2、创建一个单元测试类,进行HQL的测试,对HotNews表进行查询出4条数据。HQL语句为:select new HotNews(hotNewsId,title,synopsis,publishingTime,bannerAddress) from HotNews
单元测试方法如下所示:
@Test
public void testGetHotNewsList(){
List list = hotNewsDao.selectEntities("" +
"select new HotNews(hotNewsId,bannerAddress) from HotNews",new Object[]{},1,4);
for(HotNews row : list){
System.out.println(row.getTitle());
}
}
3、执行此单元测试方法,可以看到控制台打印出来的sql语句,如下所示:
Hibernate: select hotnews0_.hotNewsID as col_0_0_,hotnews0_.title as col_1_0_,hotnews0_.synopsis as col_2_0_,hotnews0_.publishingTime as col_3_0_,hotnews0_.bannerAddress as col_4_0_ from HotNews hotnews0_ limit ?
原文链接:https://www.f2er.com/note/422469.html