Hibernate的查询方法
1: QBE (Query By Example)
Criteriacri=session.createCriteria(Student.class);
cri.add(Example.create(s));//s是一个Student对象
listcri.list();
实质:创建一个模版,比如我有一个表serial有一个giftortoy字段,我设置serial.setgifttoy(\"2\"),
则这个表中的所有的giftortoy为2的数据都会出来
QBC查询方式
QBC(QueryByCriteria)查询方式是Hibernate提供的“更加面向对象”的一种检索方式。QBC在条件查询上比HQL查询更为灵活,而且支持运行时动态生成查询语句。
在Hibernate应用中使用QBC查询通常经过3个步骤
(1)使用Session实例的createCriteria()方法创建Criteria对象
(2)使用工具类Restrictions的相关方法为Criteria对象设置查询对象
(3)使用Criteria对象的list()方法执行查询,返回查询结果
Restrictions类的常用方法
Restrictions.eq(StringpropertyName,Objectvalue)
等于
Restrictions.allEq(MappropertyNameValues)
使用Mapkey/value进行多个等于的比对
Restrictions.gt(StringpropertyName,Objectvalue)
大于>(gt----->greaterthan)
Restrictions.ge(StringpropertyName,Objectvalue)
大于等于>=(ge----->greaterequal)
Restrictions.It(StringpropertyName,Objectvalue)
小于<(It---->lessthan)
Restrictions.Le(StringpropertyName,Objectvalue)
小于等于<=(le---->lessequal)
Restrictions.between(StringpropertyName,Objectlo,Objecthi)
对应SQL语句的Between子句
Restrictions.like(StringpropertyName,Objectvalue)
对应SQL语句的LIKE子句
Restrictions.in(StringpropertyName,Collectionvalue)
对应SQL语句的in子句
Restrictions.and(Criterionlhs,Criterionrhs)
And关系
Restrictions.or(Criterionlhs,Criterionrhs)
Or关系
Restrictions.sqlRestriction(Stringsql,Object[]values,Type[]types)
SQL限定查询
工具类Order提供设置排序方式
Order.asc(StringpropertyName)
升序排序
Order.desc(StringpropertyName)
降序排序
工具类Projections提供对查询结果进行统计与分组操作
Porjections.avg(StringpropertyName)
求某属性的平均值
Projections.count(StringpropertyName)
统计某属性的数量
Projections.countDistinct(StringpropertyName)
统计某属性的不同值的数量
Projections.groupProperty(StringpropertyName)
指定一组属性值
Projections.max(StringpropertyName)
某属性的最大值
Projections.min(StringpropertyName)
某属性的最小值
Projections.projectionList()
创建一个新的projectionList对象
Projections.rowCount()
查询结果集中记录的条数
Projections.sum(StringpropertyName)
返回某属性值的合计
QBE查询
QBE查询就是检索与指定样本对象具有相同属性值的对象。因此QBE查询的关键就是样本对象的创建,样本对象中的所有非空属性均将作为查询条件。QBE查询的功能子集,虽然QBE没有QBC功能大,但是有些场合QBE使用起来更为方便。
工具类Example为Criteria对象指定样本对象作为查询条件
Java代码
1Sessionsession=HibernateSessionFactory.getSessionFactory().openSession();
2Transactionts=session.beginTransaction();
3Customerc=newCustomer();
4c.setCname("Hibernate");
5Criteriacriteria=session.createCriteria(Customer.class);
6Criteria.add(Example.create(c));
7Iteratorit=criteria.list().iterator();
8ts.commit();
9HibernateSessionFactory.closeSession();
QBC分页查询
Criteria为我们提供了两个有用的方法:setFirstResult(intfirstResult)和setMaxResults(intmaxResults).
setFirstResult(intfirstResult)方法用于指定从哪一个对象开始检索(序号从0开始),默认为第一个对象(序号为0);setMaxResults(intmaxResults)方法用于指定一次最多检索出的对象数目,默认为所有对象。
Java代码
1Sessionsession=HibernateSessionFactory.getSessionFactory().openSession();
2Transactionts=null;
3Criteriacriteria=session.createCriteria(Order.class);
4intpageSize=15;
5intpageNo=1;
6criteria.setFirstResult((pageNo-1)*pageSize);
7criteria.setMaxResults(pageSize);
8Iteratorit=criteria.list().iterator();
9ts.commit();
10HibernateSessionFactory.closeSession();
QBC复合查询
复合查询就是在原有的查询基础上再进行查询。例如在顾客对定单的一对多关系中,在查询出所有的顾客对象后,希望在查询定单中money大于1000的定单对象
DetachedCriteriacriteria=DetachedCriteria.forClass(Model.class);
criteria.add(Restrictions.eq("userid",userid));
criteria.add(Restrictions.eq("state",false));
criteria.add(Restrictions.not(Expression.eq("freeze",false)));
criteria.addOrder(Order.desc("createtime"));
returnmodelDAO.findByCriteria(criteria);
Java代码
1Sessionsession=HibernateSessionFactory.getSessionFactory().openSession();
2Transactionts=session.beginTransaction();
3Criteriacuscriteria=session.createCriteria(Customer.class);
4CriteriaordCriteria=cusCriteria.createCriteria("orders");
5ordCriteria.add(Restrictions.gt("money",newDouble(1000)));
6Iteratorit=cusCriteria.list().iterator();
7ts.commit();
8HibernateSessionFactory.closeSession();
QBC离线查询
离线查询又叫DetachedCriteria查询,它可以在Session之外进行构造,只有在需要执行查询时才与Session绑定。
2:QBC(QueryByCriteria)主要有Criteria,Criterion,Oder,Restrictions类组成
session=this.getSession();
Criteriacri=session.createCriteria(JdItemSerialnumber.class);
Criterioncron=Restrictions.like(\"customer\",name);
cri.add(cron);
list=cri.list();
==============================
比较运算符
HQL运算符QBC运算符含义
=Restrictions.eq()等于
<>Restrictions.not(Exprission.eq())不等于
>Restrictions.gt()大于
>=Restrictions.ge()大于等于
<Restrictions.lt()小于[Page]
<=Restrictions.le()小于等于
isnullRestrictions.isnull()等于空值
isnotnullRestrictions.isNotNull()非空值
likeRestrictions.like()字符串模式匹配
andRestrictions.and()逻辑与
andRestrictions.conjunction()逻辑与
orRestrictions.or()逻辑或
orRestrictions.disjunction()逻辑或
notRestrictions.not()逻辑非
in(列表)Restrictions.in()等于列表中的某一个值[Page]
ontin(列表)Restrictions.not(Restrictions.in())不等于列表中任意一个值
betweenxandyRestrictions.between()闭区间xy中的任意值
notbetweenxandyRestrictions.not(Restrictions..between())小于值X或者大于值y
3:HQL
Stringhql=\"selects.name,avg(s.age)fromStudentsgroupbys.name\";
Queryquery=session.createQuery(hql);
list=query.list();
....
4:本地SQL查询
session=sessionFactory.openSession();
tran=session.beginTransaction();
SQLQuerysq=session.createSQLQuery(sql);
sq.addEntity(Student.class);
list=sq.list();
tran.commit();
5:QID
Session的get()和load()方法提供了根据对象ID来检索对象的方式。该方式被用于事先知道了要检索对象ID的情况。
Hibernate:HQL/QBC查询语言比较的用法
Hib的检索方式1、导航对象图检索方式。通过已经加载的对象,调用.iterator()方法可以得到order对象如果是首次执行此方法,Hib会从数据库加载关联的order对象,否则就从缓存中得到。2、OID检索方式。通过session的get,load方法知道了OID的情况下可以使用3、HQL检索方
Hib的检索方式
1、导航对象图检索方式。通过已经加载的对象,调用.iterator()方法可以得到order对象如果是首次执行此方法,Hib会从数据库加载关联的order对象,否则就从缓存中得到。
2、OID检索方式。通过session的get,load方法知道了OID的情况下可以使用
3、HQL检索方式。使用面向对象的HQL查询语句session的find方法利用HQL来查询
4、QBC检索方式。利用QBCAPI来检索它是封装了基于字符串的查询语句
5、本地的SQL检索方式。使用本地数据库的SQL查询语句Hib会负责把检索到的JDBC结果集映射为持久化对象图。
五种检索方式的使用场合和特点:
HQL:是面向对象的查询语言,同SQL有些相似是Hib中最常用的方式。
查询设定各种查询条件。
支持投影查询,检索出对象的部分属性。
支持分页查询,允许使用having和groupby
提供内制的聚集函数,sum(),min(),max()
能调用用户的自定义SQL
支持子查询,嵌入式查询
支持动态绑定参数
建议使用Query接口替换session的find方法。
QueryQ=session.createQuery("fromcustomerascwherec.name=:customerName"+"andc.age=:customerAge");
query.setString("customerName","tom");
query.setInteger("customerAge","21");
listresult=query.list();
QBC:QBCAPI提供了另一种方式,主要是Criteria接口、Criterion接口和Expression类
Criteriacriteria=session.createCriteria(customer.class);
Criterioncriterion1=Expression.like("name","t%");
Criterioncriterion2=Expression.eq("age",newInteger(21));
Critera=criteria.add(criterion1);
Critera=criteria.add(criterion2);
listresult=criteria.list();
或是:listresult=session.createCriteria(Customer.class).add(Expression.eq("this.name","tom")).list();
SQL:采用HQL和QBC检索时,Hib生成SQL语句适用所有数据库。
Queryquery=session.createSQLQuery("select{c.*}fromcustomerscwherec.namelike:customername"+"andc.age=:customerage","c",customer.calss);
query.setString("customername","tom");
query.setInteger("customerage","21");
listresult=query.list();
/////////////多态查询
HQL:session.createQuery("fromemployee");
QBC:session.createCriteria(employee.class);
HQL:session.createQuery("fromhourlyEmployee");
QBC:session.createCriteria(hourlyEmployee.class);
下面的HQL查询语句将检索出所有的持久化对象:
fromjava.lang.Object;
fromjava.io.serializable;
////////////查询的排序
1、查询结果按照客户姓名升序排列:
HQL:
Queryquery=session.createQuery
("fromcustomercorderbyc.name");
QBC:
Criteriacriteria=session.createCriteria(customer.class);
criteria.addOrder(order.asc("name"));
HQL:
Queryquery=session.createQuery("fromcustomercorderbyc.nameasc,c.agedesc");
QBC:
Criteriacriteria=session.createCriteria(customer.class);
criteria.addOrder(order.asc("name"));
criteria.addOrder(order.desc("age"));
importnet.sf.hibernate.pression.Order
importmypack.Order
...........
Criteriacriteria=session.createCritria(mypack.Order.class);
criteria.addOrder(net.sf.hibernate.Order.asc("name"));
///////////HQL语句的参数绑定Query接口
提供了绑定各种Hib映射类型的方法。
setBinary()
setString()
setBoolean()
setByte()
setCalendar()
setCharacter()
setDate()
setDouble()
setText()
setTime()
setTimestamp()
setEntity()
//把参数与一个持久化类的事例绑定
lsitresult=session.createQuery
("fromorderowhereo.customer=:customer").setEntity("customer",customer).list;
setParameter()
//绑定任意类型的参数
setProperties()
//把命名参数与一个对象的属性值绑定
Queryquery=session.createQuery
("fromcustomercwherec.name=:name"+"andc.age=:age");
Query.setProperties(customer);public AlBasic queryAlBasicByEtpsIdAndAnnlYear(String entityName, String etpsId, String annlYear) { if (etpsId == null || "".equals(etpsId) || annlYear == null || "".equals(annlYear)) return null; DetachedCriteria dc = DetachedCriteria.forEntityName(entityName); dc.add(Restrictions.eq("etpsId", etpsId)); dc.add(Restrictions.eq("annlYear", annlYear)); List result = findByCriteria(dc); if (result == null || result.size() == 0) { return null; } return (AlBasic) result.get(0); }