知识大全 Hibernate只查询部分/指定字段

Posted

篇首语:生活不是上帝的诗篇,而是凡人的欢笑和眼泪。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Hibernate只查询部分/指定字段相关的知识,希望对你有一定的参考价值。

Hibernate只查询部分/指定字段  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  公司使用

  [java]

  DetachedCriteria detachedCriteria = DetachedCriteria forClass(PeBulletin class)

  detachedCriteria createAlias( enumConstByFlagIsvalid enumConstByFlagIsvalid )

  detachedCriteria createCriteria( peSite peSite )

  detachedCriteria createCriteria( peManager peManager )

  detachedCriteria add(Restrictions eq( enumCode ))

  detachedCriteria createAlias( enumConstByFlagIstop enumConstByFlagIstop )

  detachedCriteria addOrder(Order desc( enumde )) addOrder(Order desc( publishDate ))

  DetachedCriteria detachedCriteria = DetachedCriteria forClass(PeBulletin class)

  detachedCriteria createAlias( enumConstByFlagIsvalid enumConstByFlagIsvalid )

  detachedCriteria createCriteria( peSite peSite )

  detachedCriteria createCriteria( peManager peManager )

  detachedCriteria add(Restrictions eq( enumCode ))

  detachedCriteria createAlias( enumConstByFlagIstop enumConstByFlagIstop )

  detachedCriteria addOrder(Order desc( enumde )) addOrder(Order desc( publishDate )) 的QBC方式查询数据

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

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

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

  言归正传

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

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

  [java]

  String alias = user_ ; //查询时的table别名

  DetachedCriteria dc = DetachedCriteria forClass(User class alias)

  ProjectionList pList = Projections projectionList()

  pList add(Projections property(alias + + id ) as( id ))

  pList add(Projections property(alias + + name ) as( name ))

  pList add(Projections property(alias + + age ) as( age ))

  pList add(Projections property(alias + + sex ) as( sex ))

  dc setProjection(pList)

  dc setResultTransformer(Transformers aliasToBean(User class))

  resultList = memberService findByDetached(dc) size()

  String alias = user_ ; //查询时的table别名

  DetachedCriteria dc = DetachedCriteria forClass(User class alias)

  ProjectionList pList = Projections projectionList()

  pList add(Projections property(alias + + id ) as( id ))

  pList add(Projections property(alias + + name ) as( name ))

  pList add(Projections property(alias + + age ) as( age ))

  pList add(Projections property(alias + + sex ) as( sex ))

  dc setProjection(pList)

  dc setResultTransformer(Transformers aliasToBean(User class))

  resultList = memberService findByDetached(dc) size()

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

  [java]

  package domain;

  public class Link

  private String id;

  private String name;

  private String url;

  private Integer index;

  public Link()

  //因为 String hql = select new Link(id name) from Link ;

  //所以必须要有接受 个参数的构造函数

  public Link(String id String name)

  this id = id;

  this name = name;

  

  public String getName()

  return name;

  

  public void setName(String name)

  this name = name;

  

  public String getUrl()

  return url;

  

  public void setUrl(String url)

  this url = url;

  

  

  package domain;

  public class Link

  private String id;

  private String name;

  private String url;

  private Integer index;

  public Link()

  //因为 String hql = select new Link(id name) from Link ;

  //所以必须要有接受 个参数的构造函数

  public Link(String id String name)

  this id = id;

  this name = name;

  

  public String getName()

  return name;

  

  public void setName(String name)

  this name = name;

  

  public String getUrl()

  return url;

  

  public void setUrl(String url)

  this url = url;

  

  

  通过HQL语句查询

  [java]

  String hql = select new Link(id name) from Link ;

  Query query = session createQuery(hql)

  //默认查询出来的list里存放的是一个Object对象 但是在这里list里存放的不再是默认的Object对象了 而是Link对象了

  List<Link> links = query list()

  for(Link link : links)

  String id = link getId()

  String name = link getName()

  System out println(id + : + name)

  

  String hql = select new Link(id name) from Link ;

  Query query = session createQuery(hql)

  //默认查询出来的list里存放的是一个Object对象 但是在这里list里存放的不再是默认的Object对象了 而是Link对象了

  List<Link> links = query list()

  for(Link link : links)

  String id = link getId()

  String name = link getName()

  System out println(id + : + name)

  

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

  [java]

  String hql = select id name from Link ;

  Query query = session createQuery(hql)

  //默认查询出来的list里存放的是一个Object数组 还需要转换成对应的javaBean

  List<Object[]> links = query list()

  for(Object[] link : links)

  String id = link[ ];

  String name = link[ ];

  System out println(id + : + name)

  

  String hql = select id name from Link ;

  Query query = session createQuery(hql)

  //默认查询出来的list里存放的是一个Object数组 还需要转换成对应的javaBean

  List<Object[]> links = query list()

  for(Object[] link : links)

  String id = link[ ];

  String name = link[ ];

  System out println(id + : + name)

cha138/Article/program/Java/ky/201311/28800

相关参考