公司使用

  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. 读取ViewBag匿名类

    关于遍历 viewBag匿名类错误 EF tt生成的类 明明有值眼睁睁看着 却不认识 public ActionResult Index() { MyTestEntities1 db = new My ...

  2. golang简单实现jwt验证(beego、xorm、jwt)

    程序目录结构 简单实现,用户登录后返回一个jwt的token,下次请求带上token请求用户信息接口并返回信息. app.conf文件内容(可以用个beego直接读取里面的内容)写的是一个jwt的se ...

  3. ASP.Net MVC OA项目笔记<三>

    1.1.1 业务层和数据层之间加一个数据会话层,封装所有数据操作类实例的创建(工厂类) 工厂类是负责对象的创建 作用:将BLL和DAL解耦了,提供一个数据访问的统一访问点 数据会话层DBSession ...

  4. DDD Code First 迁移数据实现EF CORE的软删除,值对象迁移配置

    感谢Jeffcky大佬的博客: EntityFramework Core 2.0全局过滤 (HasQueryFilter) https://www.cnblogs.com/CreateMyself/p ...

  5. vscode卡死问题

    网上有人说是和淘宝镜像冲突,也不知啥原因,接下来一下操作会好点: 文件->首选项->设置,搜索search.followSymlinks,把对勾去掉就行 1.修复vs code 造成 rg ...

  6. Python 爬虫(二十五) Cookie的处理--cookielib库的使用

    Python中cookielib库(python3中为http.cookiejar)为存储和管理cookie提供客户端支持. 该模块主要功能是提供可存储cookie的对象.使用此模块捕获cookie并 ...

  7. JavaScript基础(3)-JS中的面向对象、定时器、BOM、位置信息

    一.创建对象的几种常用方式. 1.使用Object或对象字面量创建对象: a.使用Object()内置的构造函数来创建对象,例如: var student = new Object(); // 创建一 ...

  8. 跟着刚哥学Redis

    NoSQL 简介 NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL".是对不同于传统的关系型数据库的数据库管理系统的统称.它泛指非关系型的数据库.随着 ...

  9. MySQL 排名统计(常用功能函数)

    select actor_id,@curr_cnt:=cnt as cnt , ,@rank) as rank, @prev_cnt:=@curr_cnt as dummy from( select ...

  10. java实现文件上传下载

    喜欢的朋友可以关注下,粉丝也缺. 今天发现已经有很久没有给大家分享一篇技术文章了,于是想了一下给大家分享一篇java实现文件上传下载功能的文章,不喜欢的希望大家勿喷. 想必大家都知道文件的上传前端页面 ...