公司使用

  1. DetachedCriteria detachedCriteria = DetachedCriteria.forClass(PeBulletin.class);
  2. detachedCriteria.createAlias("enumConstByFlagIsvalid", "enumConstByFlagIsvalid");
  3. detachedCriteria.createCriteria("peSite", "peSite");
  4. detachedCriteria.createCriteria("peManager", "peManager");
  5. detachedCriteria.add(Restrictions.eq("enumConstByFlagIsvalid.code", "1"));
  6. detachedCriteria.createAlias("enumConstByFlagIstop", "enumConstByFlagIstop");
  7. detachedCriteria.addOrder(Order.desc("enumConstByFlagIstop.code")).addOrder(Order.desc("publishDate"));

的QBC方式查询数据。

这种方式的最大好处是几乎完全面向对象,是一种在HQL更上层的对象封装了,几乎让你忘记SQL是什么玩意了。

但是他有一个最大的弊端就是效率问题。默认他会查询这个对象的所有字段【包括它的关联对象】。像我上面这个查询最后查出来的字段起码有100多个字段了。效率问题可想而知。实在不想去写SQL或HQL,太麻烦了,于是想到将其进行优化的最好方法。

果然QBC提供了字段的部分查询。也许hibernate的作者说得对,说hibernate效率低,只能说你还不懂怎么去用,虽然这家伙在写hibernate之前不懂SQL。它的二级缓存做得不错。

言归正传。

Hibernate 使用查询部分/指定字段,有三种字现方式:

第一种是使用高级查询DetachedCriteria实现,代碼如下:

  1. String alias = "user_"; //查詢時的table別名
  2. DetachedCriteria dc = DetachedCriteria.forClass(User.class,alias);
  3. ProjectionList pList = Projections.projectionList();
  4. pList.add(Projections.property(alias + "." + "id").as("id"));
  5. pList.add(Projections.property(alias + "." + "name").as("name"));
  6. pList.add(Projections.property(alias + "." + "age").as("age"));
  7. pList.add(Projections.property(alias + "." + "sex").as("sex"));
  8. dc.setProjection(pList);
  9. dc.setResultTransformer(Transformers.aliasToBean(User.class));
  10. resultList = memberService.findByDetached(dc).size();

第二种方式是通过HQL语句new POJO()实现,方法如下:

  1. package com.domain;
  2. public class Link {
  3. private String id;
  4. private String name;
  5. private String url;
  6. private Integer index;
  7. public Link(){}
  8. //因为:String hql = "select new Link(id,name) from Link";
  9. //所以必须要有接受2个参数的构造函数
  10. public Link(String id,String name){
  11. this.id = id;
  12. this.name = name;
  13. }
  14. public String getName() {
  15. return name;
  16. }
  17. public void setName(String name) {
  18. this.name = name;
  19. }
  20. public String getUrl() {
  21. return url;
  22. }
  23. public void setUrl(String url) {
  24. this.url = url;
  25. }
  26. }

通過HQL语句查询

  1. String hql = "select new Link(id,name) from Link";
  2. Query query = session.createQuery(hql);
  3. //默认查询出来的list里存放的是一个Object对象,但是在这里list里存放的不再是默认的Object对象了,而是Link对象了
  4. List<Link> links = query.list();
  5. for(Link link : links){
  6. String id = link.getId();
  7. String name = link.getName();
  8. System.out.println(id + " : " + name);
  9. }

第三种方式是通过HQL语句实现,类似SQL,方法如下:

  1. String hql = "select id,name from Link";
  2. Query query = session.createQuery(hql);
  3. //默认查询出来的list里存放的是一个Object数组,还需要转换成对应的javaBean。
  4. List<Object[]> links = query.list();
  5. for(Object[] link : links){
  6. String id = link[0];
  7. String name = link[1];
  8. System.out.println(id + " : " + name);
  9. }

Hibernate高效查询,只查询部分/指定字段的更多相关文章

  1. Navicat查询哪些表有指定字段名

    通常需要查询某个字段来自于哪张表,在navicat中没有直接查哪些表有指定字段名的功能,只能用sql来查. 1.(按字段名查表)查询哪些表有指定字段名(比如查字段名article_id)的SQL: S ...

  2. Mybatis-Plus中使用max、sum聚合函数、只查询指定字段、查询语句多个OR处理

    聚合函数查询 可以使用以下方法 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.select(" I ...

  3. mongodb中查询返回指定字段

    mongodb中查询返回指定字段   在写vue项目调用接口获取数据的时候,比如新闻列表页我只需要显示新闻标题和发表时间,点击每条新闻进入详情页的时候才会需要摘要.新闻内容等关于此条新闻的所有字段.  ...

  4. MongoDB查询指定字段(field)返回指定字段的方法

    使用MongoDB的时候需要只查询指定的字段进行返回,也就是类似mysql里面的 SELECT id,name,age 这样而不是SELECT *.在MongoDB里面映射(projection)声明 ...

  5. SQL查询数据库中所有指定类型的字段名称和所在的表名

    --查询数据库中所有指定类型的字段名称和所在的表名 --eg: 下面查的是当前数据库中 所有字段类型为 nvarchar(max) 的字段名和表名 SELECT cols.object_id , co ...

  6. Linq 中查询一个表中指定的字段

    //Linq中查询一个表中指定的几个字段: ); // FindAllItems()为查询对应表的所有数据的方法: // Where 里面为查询条件 // Select 为查询的筛选条件 new{} ...

  7. 把一个select查询结果插入到一个表(可选指定字段和值实例)

    把一个select查询结果插入到一个表(可选指定字段和值实例) insert into  bak (cc,yf) select cc,9 from ket insert into bak (cc,yf ...

  8. Oracle生成查询包含指定字段名对应的所有数据表记录语句

    应用场合:已知字段名字,查询数据库中所有数据表中包含该字段名的所有数据表 操作办法:指定字段名,数据库表用户,执行下面查询语句即可 --Oracle生成查询包含指定字段名对应的所有数据表记录语句 de ...

  9. mysql 查询结果集按照指定的字段值顺序排序

    mysql 查询结果如果不给予指定的order by ,那么mysql会按照主键顺序(innodb引擎)对结果集加以排序,那么最后的排序可能就不是你想要的排序结果. 举个例子,我要按照前端传过来的mo ...

随机推荐

  1. Android RelativeLayout wrap_content 而且 child view 使用 layout_alignParentBottom 时 RelativeLayout 高度会占满屏幕

    Android RelativeLayout wrap_content 而且 child view 使用 layout_alignParentBottom 时 RelativeLayout 高度会占满 ...

  2. Python资源 --Python库

    环境管理 管理 Python 版本和环境的工具 pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令. virtualenv – 创建独立 Python 环境的工 ...

  3. PICE(2):JDBCStreaming - gRPC-JDBC Service

    在一个akka-cluster环境里,从数据调用的角度上,JDBC数据库与集群中其它节点是脱离的.这是因为JDBC数据库不是分布式的,不具备节点位置透明化特性.所以,JDBC数据库服务器必须通过服务方 ...

  4. Linux inode空间占满 “no space left on device”

    Linux inode空间占满 提示 “no space left on device” 中文环境:“无法创建XXX目录,设备没有空间” Linux系统iNode耗尽硬盘无法写入文件怎么办?df -h ...

  5. Linux的mv 命令

    mv 命令的10个例子 1.移动文件 移动文件时需要注意的是文件的源地址和目标地址必须不同.这里有个例子,想要将file_1.txt文件从当前目录移动到其它目录,以/home/pungki/为例,语法 ...

  6. C#:ListView控件如何实现点击列表头进行排序?

    using System; using System.Collections; using System.Windows.Forms; namespace Common { /// <summa ...

  7. JAVA框架之Hibernate【Hibernate缓存详解】

    1.缓存介绍 Hibernate中提供了两级Cache,第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存.这一级别的缓存由hibernate管理的,一般情况下无需进行干预:第二级别的缓 ...

  8. IdentityServer-Protecting an API using Client Credentials

    使用客户凭证保护API 这篇快速开始将展示使用IdentityServer保护APIs的最基本使用场景. 在此场景中我们将定义一个API和一个要访问此API的客户端. 客户端将向IdentitySer ...

  9. 全网最详细的Cloudera Hue执行./build/env/bin/supervisor 时出现KeyError: "Couldn't get user id for user hue"的解决办法(图文详解)

    不多说,直接上干货! 问题详情 如下: [root@bigdata-pro01 hue--cdh5.12.1]# ./build/env/bin/supervisor Traceback (most ...

  10. msvcr110.dll丢失解决方案

    http://www.microsoft.com/zh-CN/download/details.aspx?id=30679 打开之后,在“选择语言”里选择“简体中文”,然后点击右边的“下载”按钮.