Hibernate高效查询

来源:互联网 发布:银行表外业务数据 编辑:程序博客网 时间:2024/06/17 13:43
公司使用
 
 
[java] 
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(PeBulletin.class);  
detachedCriteria.createAlias("enumConstByFlagIsvalid", "enumConstByFlagIsvalid");  
detachedCriteria.createCriteria("peSite", "peSite");  
detachedCriteria.createCriteria("peManager", "peManager");  
detachedCriteria.add(Restrictions.eq("enumConstByFlagIsvalid.code", "1"));  
detachedCriteria.createAlias("enumConstByFlagIstop", "enumConstByFlagIstop");  
detachedCriteria.addOrder(Order.desc("enumConstByFlagIstop.code")).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("enumConstByFlagIsvalid.code", "1"));
detachedCriteria.createAlias("enumConstByFlagIstop", "enumConstByFlagIstop");
detachedCriteria.addOrder(Order.desc("enumConstByFlagIstop.code")).addOrder(Order.desc("publishDate"));
 
 
的QBC方式查询数据。
 
这种方式的最大好处是几乎完全面向对象,是一种在HQL更上层的对象封装了,几乎让你忘记SQL是什么玩意了。
 
但是他有一个最大的弊端就是效率问题。默认他会查询这个对象的所有字段【包括它的关联对象】。像我上面这个查询最后查出来的字段起码有100多个字段了。效率问题可想而知。实在不想去写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 com.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";   
//所以必须要有接受2个参数的构造函数   
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 com.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";
//所以必须要有接受2个参数的构造函数
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[0];  
String name = link[1];  
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[0];
String name = link[1];
System.out.println(id + " : " + name);
0 0
原创粉丝点击