公司使用

  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. python threading模块2

    Thread 是threading模块中最重要的类之一,可以使用它来创建线程.有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法:另一种是创建一个threading.Thread对 ...

  2. 一不小心发现了个Asp.Net Bug

    1. Ver是页面定义的变量 2. asp.net 页面定义为  <link href="/company/them/page.css?v=<%=Ver%>" r ...

  3. 用C#中的键值对遍历数组或字符串元素的次数

    代码如下: string strs = "ad6la4ss42d6s3"; Dictionary<char, int> dic = new Dictionary< ...

  4. python 通过pytz模块进行时区的转换,获取指定时区的时间

    import pytz import time import datetime print(pytz.country_timezones('cn')) # 查询中国所拥有的时区 print(pytz. ...

  5. 百度地图sdk---pc端

    <div class="map" style="width: 1196px;height: 500px;margin: 50px auto;"> & ...

  6. win下wamp虚拟主机配置

    第一步:在http://www.wampserver.com/网站上下载Wampserver,可以根据计算机的版本(32位或者64位)下载对应的版本 第二步,傻瓜式安装(直接点击下一步,下一步就好). ...

  7. Java入门-类HelloWorld是公共的,应在名为HelloWorld.java的文件中声明

    开始学习java了,搭好环境,notepad++中新建一个java文件,新建一个HelloWorld类, public class HelloWorld { public static void ma ...

  8. BIND DNS拒绝服务漏洞 CVE-2016-2776修复

    接到此漏洞之后,略微查了一下相关描述,发现漏洞影响范围很大,可能造成的影响也很严重,于是着手进行修复. 漏洞的详细信息可见如下链接: http://www.cnvd.org.cn/flaw/show/ ...

  9. java重点知识

    一.java基本知识点 java是由SUN公司在1995年推出的,在2009年SUN公司又被甲骨文公司收购,所以甲骨文公司获得java版权.其底层是由C语言写的,java分为三个体系: JavaSE, ...

  10. JavaSE-异常

    1.try catch finally 异常捕获 public class ExceptionTest { public static void main(String[] args) { int a ...