Hibernate hql 查询指定字段并获取结果集

在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 ?

由上,可以看出,只查询了指定的热点医讯ID、标题、简介、发布时间、banner图片地址列的数据。

相关文章

学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习...
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面...
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生...
Can’t connect to local MySQL server through socket \'/v...
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 ...
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服...