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);  
    }  

相关推荐