`
ktoolcn
  • 浏览: 25556 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

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

阅读更多
转自:http://www.blogjava.net/stevenjohn/archive/2012/10/25/390219.html

Hibernate hql 查询指定字段并获取结果集
在hibernate中,用hql语句查询实体类,采用list方法的返回结果为一个List,该List中封装的对象分为以下三种情况:
1.查询全部字段的情况下,如"from 实体类",list中封装的对象为实体类本身,各属性都将得到填充。
2.只查询一个字段,默认情况下,list中封装的是Object对象。
3.查询两个或两个以上的字段,默认情况下,list中封装的是Object[],长度与所查询的字段数一致。
对于后两种情况,用标签遍历时不太方便,因为无法直接转换成实体类的对象。比较简单的解决方法是:

の:在hql中使用select new 包名.类名(属性1,属性2……) from 实体类,同时在实体类中添加带参的构造方法,参数的个数和顺序与(属性1,属性2……) 保持一致,这样我们得到的list中存放的依然是实体类的对象,所查询到的属性得到了填充,使用起来更为方便。
  の: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


public class Problem { 
    private int pid; 
    private int score; 
    private int timeLimit; 
    private int memoryLimit; 
    private int totalAccept; 
    private int totalSubmission; 
    private int unSee; 
    private String title; 
    private String description; 
    private String input; 
    private String output; 
     
    public Problem(int pid, int score,String title, int totalAccept, int totalSubmission, 
             int unSee) { 
        super(); 
        this.pid = pid; 
        this.score = score; 
        this.totalAccept = totalAccept; 
        this.totalSubmission = totalSubmission; 
        this.unSee = unSee; 
        this.title = title; 
    } 
    //省略getter 和 setter  

查询语句如下
      Query query=session.createQuery("select new Problem(pid,score,title,totalAccept,totalSubmission,unSee) from Problem order by pid"); 
        //query.setFirstResult(firstResult); //分页函数  
        //query.setMaxResults(maxResutl);  
     
        List<Problem> problems=query.list();//返回的还是Problem对象









关于hibernate的问题:
我现在有条
hql="select s.id,s.name,t.id,t.name from User s,Useraddress t where t.id=s.id"

这条sql里面的User和Useraddress是两个实体类,现在组合查询分别取出来两个实体类里面的两个字段,然后我想再建立一个实体类Result,里面定义这四个结果集里面的字段,能不能执行完这条hql,正好把这个结果集对应到实体类Result里面呢,Result这个实体类,没写映射文件Result.hbm.xml.
希望能帮下忙

2种做法
创建一个class temp
有属性sid,name,tid,sname,tname
创建一个构造函数
public temp(sid,name,tid,sname,tname)
{

}
1.hql中
List<temp>

select new temp(s.id,s.name,t.id,t.name) from User s,Useraddress t where t.id=s.id

2.List
记录的每一行是object[] 遍历
object[0] ==s.id
object[1] ==s.name
object[2] ==t.id
object[3] ==t.name




感谢glamey兄弟的文章,正好解决了当前遇到的问题。原文链接如下:http://glamey.iteye.com/blog/721019
        假设我们现在有一个DTO,其属性包括两张表的属性,我们现在需要将sql语句查询得到的内容转为一个DTO对象,其解决方法如下: 

String sql = "select u.userName as userName ,p.title as title ,p.addTime as addTime from user as u,post as p where u.id=p.userId" 
Query q = factory.getCurrentSession().createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(PostVO.class));

      上面select中as后面的内容必须和PostVO中属性名一致,这样就可以返回一个针对PostVO的一个集合。
        其实大家可以看下hibernate这一部分的源码就会发现,主要是使用了AliasToBeanResultTransformer这个类,通过sql的查询,会返回数组,然后hibernate根据数据表的映射,自动帮我们来set对应的字段属性,所以标红的部分务必要跟VO中的属性值一直,要不然会报错的。
        如果需要的话,大家也可以重写这个类。例如VOResultTransformer。然后在dao中更改成: 

setResultTransformer(new VOResultTransformer(PostVO.class));

  另外,除了以上glamey的方法外,还有一种方法: 
Query q = session.createQuery("select new com.hibernate.MsgInfo(m.id, m.cont, m.topic.title, m.topic.category.name) from Msg m");
List<MsgInfo> list=q.list();

     其中,MsgInfo是DTO。值得注意的是,第二种方法中DTO必须提供带参数的构造方法,并且HQL语句中属性的位置要与构造方法中的位置一一对应。
分享到:
评论

相关推荐

    “推荐系统”相关资源推荐

    推荐了国内外对推荐系统的讲解相关资源

    全渠道电商平台业务中台解决方案.pptx

    全渠道电商平台业务中台解决方案.pptx

    云计算企业私有云平台建设方案.pptx

    云计算企业私有云平台建设方案.pptx

    通过CNN卷积神经网络对盆栽识别-含图片数据集.zip

    本代码是基于python pytorch环境安装的。 下载本代码后,有个requirement.txt文本,里面介绍了如何安装环境,环境需要自行配置。 或可直接参考下面博文进行环境安装。 https://blog.csdn.net/no_work/article/details/139246467 如果实在不会安装的,可以直接下载免安装环境包,有偿的哦 https://download.csdn.net/download/qq_34904125/89365780 安装好环境之后, 代码需要依次运行 01数据集文本生成制作.py 02深度学习模型训练.py 和03pyqt_ui界面.py 数据集文件夹存放了本次识别的各个类别图片。 本代码对数据集进行了预处理,包括通过在较短边增加灰边,使得图片变为正方形(如果图片原本就是正方形则不会增加灰边),和旋转角度,来扩增增强数据集, 运行01数据集文本制作.py文件,会就读取数据集下每个类别文件中的图片路径和对应的标签 运行02深度学习模型训练.py就会将txt文本中记录的训练集和验证集进行读取训练,训练好后会保存模型在本地

    0.96寸OLED显示屏

    尺寸与分辨率:该显示屏的尺寸为0.96英寸,常见分辨率为128x64像素,意味着横向有128个像素点,纵向有64个像素点。这种分辨率足以显示基本信息和简单的图形。 显示技术:OLED(有机发光二极管)技术使得每个像素都能自发光,不需要背光源,因此对比度高、色彩鲜艳、视角宽广,且在低亮度环境下表现更佳,同时能实现更低的功耗。 接口类型:这种显示屏通常支持I²C(IIC)和SPI两种通信接口,有些型号可能还支持8080或6800并行接口。I²C接口因其简单且仅需两根数据线(SCL和SDA)而广受欢迎,适用于降低硬件复杂度和节省引脚资源。 驱动IC:常见的驱动芯片为SSD1306,它负责控制显示屏的图像显示,支持不同显示模式和刷新频率的设置。 物理接口:根据型号不同,可能有4针(I²C接口)或7针(SPI接口)的物理连接器。 颜色选项:虽然大多数0.96寸OLED屏为单色(通常是白色或蓝色),但也有双色版本,如黄蓝双色,其中屏幕的一部分显示黄色,另一部分显示蓝色。

    2024年欧洲高端家用P1.29 LED显示屏市场主要企业市场占有率及排名.docx

    2024年欧洲高端家用P1.29 LED显示屏市场主要企业市场占有率及排名

    5G智慧校园顶层设计方案.pptx

    5G智慧校园顶层设计方案.pptx

    在Delphi编程环境下实现上位机与PLC的串行通信

    介绍了通过引进 ActiveX控件 MSComm ,在 Delphi 6. 0 编程环境下 ,实现上位机与 Omron C200H PLC串行通信的一般方法 ,并给出了工程实例。该方法简单可靠、便于移植、实用性强 ,在工业控制中有着广泛的用途。

    程序设计训练之 Rust 编程语言 第四讲:泛型、特型与生命周期

    程序设计训练之 Rust 编程语言 第四讲:泛型、特型与生命周期

    山寨版的神州数码802.1x认证supplicant,基于pcap库的C语言的跨平台的原生客户端。.zip

    山寨版的神州数码802.1x认证supplicant,基于pcap库的C语言的跨平台的原生客户端。

    数字乡村建设方案.pptx

    数字乡村建设方案.pptx

    基于CRT(远程访问终端)+ARM(GEC)+Linux+C语言的视频监控系统.zip

    基于CRT(远程访问终端)+ARM(GEC)+Linux+C语言的视频监控系统

    建筑结构水电欧式6套(14.5x20.2)\施工图\A型施工图-建筑-空施00.dwg

    建筑结构水电欧式6套(14.5x20.2)\施工图\A型施工图-建筑-空施00.dwg

    基于ThinkPHP8.0搭建的后台管理系统EasyAdmin8

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

    21121344 马丽娟.doc

    21121344 马丽娟.doc

    C++与操作系统等面试题63

    C++与操作系统等面试题63

    【工具模型】麦肯锡咨询师常用模型.pptx

    【工具模型】麦肯锡咨询师常用模型.pptx

    《LEARNING Vue.js》是一本免费电子书,由Stack Overflow社区的贡献者们创建和编写

    这本书的内容汇集了来自Stack Overflow上关于Vue.js的高质量回答和讨论,旨在帮助读者学习和掌握Vue.js框架的基本知识和应用技巧。 书籍特点: 社区贡献:内容来源于Stack Overflow社区中经验丰富的开发者,他们分享了自己的知识和解决方案。 免费获取:这本书可以免费获取,适合希望以低成本学习Vue.js的读者。 实用性强:内容包括实际问题的解决方案和最佳实践,帮助读者在真实项目中应用所学知识。 适合读者: 初学者:刚开始学习Vue.js,希望通过实际问题的解决方案来理解基本概念的读者。 有经验的开发者:希望深入了解Vue.js的具体应用和最佳实践,并从社区经验中受益的开发者。

    cy的python作业.zip

    Python零基础,大作业,加强,复习巩固!!!

Global site tag (gtag.js) - Google Analytics