??xml version="1.0" encoding="utf-8" standalone="yes"?> 对应SQL “field=value”表达?/p>
如:Expression.eq("name","Erica") 对应SQL“between”表达?/p>
如:Expression.between("age",new Integer(13),new Integer(50)); and关系l合Q如Q?/p>
Expression.add(Expression.eq("name","Erica"),Expression.add("sex",new Integer(1))) or关系l合Q如Q?/p>
Expression.or(Expression.eq("name","Erica"),Expression.add("sex",new Integer(1))) 作ؓ补充Q本Ҏ提供了原生SQL语法的支持,我们可以通过q个Ҏ直接通过SQL语句限定查询条g 下面的代码返回所有名UC"Erica"其实的记录: 上例对当前的TUser记录按照q龄q行分组。通过Projections.groupPropertyҎQ我们指定了用于分组的目标属?#8220;age”。生成的SQL语句Qselect this.age as y0_ from T_User this_group by this_.age?br />
另外Q对于多条gl合的统计、分l功能,我们可以借助ProjectionList完成Q下面的例子中,我们l计了各个年龄层ơ中的用h量:
]]>Criteria criteria=session.createCriteria(TUser.class);
criteria.add(Expression.eq("name","Erica"));
criteria.add(Expression.eq("sex",new Integer(1));
Criteria查询表达?br />
Criteria本n只是一个容器,具体的查询条件要通过Criteria.addҎd到Criteria实例中?br />
Ҏ
描述
Expression.eq
Expression.allEq
参数Z个Map对象Q其中包含了多个属?值对应关pR相当于多个Expression.eq关系的叠?/td>
Expression.gt
对应SQL“field>value”表达?/td>
Expression.ge
对应SQL“field>=value”表达?/td>
Expression.lt
对应SQL“field<value”表达?/td>
Expression.le
对应SQL“field<=value”表达?/td>
Expression.between
Expression.like
对应SQL"field like valule"表达?/td>
Expression.in
对应SQL“field in...”表达?/td>
Expression.eqproperty
用于比较两个属性之间的|对应SQL“field>field”
Expression.gtProperty
用于比较两个属性之间的|对应SQL“field>=field”
Expression.ltProperty
用于比较两个属性之间的|对应SQL"field<field"
Expression.leProperty
用于比较两个属性之间的|对应SQL"field<=field"
Expression.and
Expression.or
Expression.sql
Expression.sql("lower({alias}.name) like lower(?)","Erica%",Hibernate.STRING);
其中?{alias}"Hibernate在运行期使用当前兌的POJO别名替换
在Hibernate3中,引入了RestrictionscM为Expression的替代?br />
CZ查询
ExamplecdCCriteria接口Q同P它也可以用作Criteria的查询条件。Example的作用是Q根据已有对象,查找属性与之相W的其他对象?br />
Criteria criteria=session.CreateCriteria(TUser.class);
TUser exampleUser=new TUser();
exapleUser.getName("Erica");
criteria.add(Example.create(exampleUser));
List<TUser> list=criteria.list();
for(TUser user:list){
System.out.println(user.getName());
}
复合查询
Criteria criteria=session.createCriteria(TUser.class);
Criteria addrCriteria=criteria.createCriteria("addresses");
addrCriteria.add(Expression.like("addresses","%shanghai%"));
List<TUser> list = criteria.list();
for(TUser user:list){
System.out.println(user.getName());
Set<TAddress> addrSet=user.getAddresses();
for(TAddress addr:addrSet){
System.out.println(addr.getAddress());
}
}
DetachedCriteria
Hibernate2中,Criteria生命周期位于其宿主Session生命周期中,也就是说Q由某个session创徏的Criteria实例Q一旦session销毁,那么此Criteria实例也随之失效?br />
Hibernate3中引入了DetachedCriteriaQDetachedCriteria可以qsession实例独立存在Q这P我们可以将某些通用的Criteria查询条gq行抽离Q每ơ用时再与当前session实例l定以获得更好的代码重用效果?br />
DetachedCriteria deCriteria=DetachedCriteria.forClass(TUser.class);
deCriteria.add(Expression.eq("name","Erica"));
deCriteria.add(Expression.eq("sex",new Integer(1)));
Criteria criteria=deCriteria.getExecutableCriteria(session);
List<TUser> list=criteria.list();
for(TUser user:list){
System.out.println(user.getName());
}
DetachedCriteria aveAge=DetachedCriteria.forClass(TUser.class);
avgAge.setProjection(Projections.avg("age"));
Criteria criteria=session.createCriteria(TUser.class);
criteria.add(Subqueries.propertyGT("age",avgAge));
Criteria高Ҏ?br />
限定q回的记录范?/strong>
通过criteria.setFirstResult/setMaxResultsҎ可以限制一ơ查询返回的记录范围Q?br />
Criteria criteria=session.createCriteria(TUser.class);
//限定查询q回索结果中Q从100条结果开始的20条记?/span>
criteria.setFirstResult(100);
criteria.setMaxResults(20);
//
//
Criteria criteria=session.createCriteria(TUser.class);
criteria.add(Expression.eq("groupId",new Integer(2)));
criteria.addOrder(Order.asc("name"));
criteria.addOrder(Order.desc("groupId"));
分组与统?br />
在Hibernate3中,我们q可以通过Criteria完成分组和统计。分l、统计表辑ּ由Hibernate3新引入的Projections Classq行装?br />
Criteria criteria=session.createCriteria(TUser.class);
criteria.setProjection(Projections.groupProperty("age"));
List<TUser> list=criteria.list();
for(TUser user:list){
System.out.println(user);
}
ProjectionList projectionlist=Projections.ProjectionList();
projectionList.add(Projections.groupProperty("age"));
projectionList.add9Projections.rowCount());
Criteria criteria=session.createCriteria(TUser.class);
criteria.setProjection(projectionList);
]]>
主键兌Q?/strong>即两张表通过主键形成一对一映射关系?/p>
用户TUser与护照TPassport兌
TUer.hbm.xml
<hibernate-mapping>
<class
name="
TUser"
table="T_User">
<one-to-one
name="passport"
class="
TPassport"
cascade="all"
outer-join="true"/>
</class>
</hibernate-mapping>
TPassport.hbm.xml
<hibernate-mapping>
<class
name="
TPassport"
table="T_Passport">
<one-to-one
name="user"
class="
TUser"
constrain="true">
.
</class>
</hibernate-mapping>
试代码Q?br />
TUser user = new TUser();
user.setAge(new Integer(20));
user.setName("Carin");
TPassport passport = new TPassport();
passport.setSerial("PCN759386");
passport.setExpiry(new Integer(20080101));
//怺讄兌
passport.setUser(user);
user.setPassport(passport);
Transaction tx = sessioin.beginTransaction();
//׃TUsercȝone-to-one节点被设|成
//cascade=“all”其关联的passport对象被U联保存
session.save(user);
tx.commit();
TUser user=(TUser)Hibernate.load(TUser.class,new Integer(15));
System.out.println("User name=>"+user.getName());
System.out.println("Passport Serial=>"+user.getPassport().getSerial());
Hibernate:select tuser0_.id as id1_,
from T_USER tuser0_
left outer join
T_PASSPORT tpassport1_ on tuser0_.id=tpassport1_.id
where tuser0_.id=?
User name=>Carin
Passport Serial=>PCN759386
一对多兌
用户TUser和地址TAddress的一对多兌?br />
单向一对多兌
L方TUser的映配|:
<hibernate-mapping>
<class
name="
TUser"
table="t_user"
dynamic-update="true"
dynamic-insert="true">
.
<set
name="address"
table="t_address"
cascade="all"
order-by="zipcode asc">
<key column="user_id"/>
<one-to-many class="
TAddress">
</set>
</class>
</hibernate>
双向多对一兌
实际上是“一对多”?#8220;多对一”兌的组合。也是说我们必dL斚w|一对多关系的基上,在被控方配置与其对应的多对一兌?br />
TUser.hbm.xml
<hibernate-mapping>
<class
name="
TUser"
table="t_user"
dynamic-update="true"
dynamic-insert="true">
.
<set
name="address"
table="t_address"
lazy="false"
inverse="true"
cascade="all"
sort="unsorted"
order-by="zipcode asc">
<key column="user_id"/>
<one-to-many class="
TAddress"/>
</set>
.
</class>
</hibernate>
<hibernat-mapping>
<class
name="
TAddress"
table="t_address"
dynamic-update="false"
dynamic-insert="false">
.
<many-to-one
name="user"
class="TUser"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="user_id"
not-null="true"/>
.
</class>
</hibernate-mapping>
多对多关?br />
需要借助中间表来完成多对多映信息的保存?br />
׃多对多关联的性能不佳Q由于引入了中间表,一ơ读取操作需要反复多ơ查询)Q因此在设计中应该避免大量用。同Ӟ在多对多关系中,应根据情况,采取延迟加蝲机制来避免无谓的性能开销?br />
TGroup与TRole的多对多兌Q?br />
TGroup.hbm.xmlQ?br />
<hibernate-mapping>
<class
name="
TGroup"
table="t_group"
dynamic-update="false"
dynamic-insert="false">
.
<set
name="roles"
table="t_group_role"
lazy="false"
inverse="false"
cascade="save-update">
<key column="group_id"/>
<many-to-many
class="
TRole"
column="role_id"/>
</set>
.
</class>
</hibernate>
TRole.hbm.xmlQ?br />
<hibernate-mapping>
<class
name="
TRole"
table="t_role"
dynamic-update="false"
dynamic-insert="false">
.
<set
name="groups"
table="t_group_role"
lazy="false"
inverse="true"
cascade="save-update"
sort="unsorted">
<key column="role_id"/>
<many-to-many
class="
TGroup"
column="group_id"
outer-join="auto"/>
</set>
.
</class>
</hibernate>
]]>
]]>
<id name="" column="" type="">
<generator class=""> 讄主键生成?br />
</id>
Hibernate框架内徏Z键提供了多种生成器,具体包括如下内容Q?br />
1. incrementQ用于ؓlongQshortQintcd生成唯一标识?br />
2. identityQ对DB2QMySQLQMS SQL ServerQSybase和HypersonicSQL的内|标识字D|供支持?br />
3. sequenceQ在DB2QPostgreSQLQOracleQSAPDBQMcKoi中用序列(sequenceQ,而在Interbase中用生成器QgeneratorQ?br />
4. hiloQ用一个高/低位法高效生成longQshort或intcd的标识符。给定一个表和字D(默认分别是hibernate_unique_key和nextQ作为高位值的来源。高/低位法生成的标识符只在一个特定的数据库中是唯一的?br />
5. seqhiloQ用一个高/低位法高效生成longQshort或intcd的标识符Q给定一个数据库序列QsequenceQ的名字?br />
6. uuid.hexQ用一?28-bit的UUID法生成字符串类型的标识W。在一个网l中是唯一的(使用了IP地址Q。UUID被编码位一?2?6q制数字的字W串?br />
7. uuid.stringQ用同LUUID法。UUID被编码位一?6个字W长的Q意ASCII字符l成的字W串?br />
8. nativeQ根据底层数据库的能力选择identity、sequence、hilo中的一个?br />
9. assignedQ让应用E序在插表之前ؓ对象分配一个标识符?br />
10. foreignQ用另一个相兌的对象的标识W。通常被用在有兌关系的表中?br />
一般来_在Hibernate中,不推荐用assigned作ؓ主键生成器。因为对数据库表来说Q以业务逻辑字段作ؓ主键有潜在的危险性。当该业务逻辑字段在将来需要改变的时候,作ؓ主键的应用就会相当麻烦。常用的手段是用一个和业务无关的字D作Z键,而在PO中定义这个字D|为变量属性,同事又作对象的惟一标识?/span>