hibernate API笔记文档格式.docx
- 文档编号:4412916
- 上传时间:2023-05-03
- 格式:DOCX
- 页数:14
- 大小:23.04KB
hibernate API笔记文档格式.docx
《hibernate API笔记文档格式.docx》由会员分享,可在线阅读,更多相关《hibernate API笔记文档格式.docx(14页珍藏版)》请在冰点文库上搜索。
同样可以使用setEntity(0,对象实例)来直接加入对象进行条件映射
.setString设置简单的字符串
如果返回的结果只有一个,可以使用.setEntity()等条件后.uniqueResult(),这样返回一个Object,然后进行类型的强制转换
也可以使用SetuniqueMothers=newHashSet(query.list())来过滤重复的查询结果
使用迭代式的获取结果Iterating
某些情况下使用iterate方法得到更好的性能,不过是在缓存或者session已存在的情况,不然更慢
有的时候根据语句会生成Object[]形式的结果,按照例子都是用.list().iterator()的方法执行查询,然后进行遍历,通常只有一个结果
其中第一个就是Object[]
标量查询...就是统计函数等,countmin等SQL函数,同样使用上面的方法进行遍历结果
while(results.hasNext())
{
Object[]row=(Object[])result.next();
Colortype=(Color)row[0]
Dateoldest=(Date)row[1]....使用对象类型进行接受(值类型使用对应的包装类型)
}
绑定参数主要形式有?
和:
参数名两种方法
:
参数名形式
Queryq=session.createQuery("
fromxxwherec=:
name"
);
q.setString("
"
XXXX"
)
?
形式使用0开始的下标索引
还有一种批量的设置单个元素为多条件的方法比如使用在sql的in方法之上时
Queryq=session.createQuery("
fromDeoncatwherecat.namein(:
nameList)"
q.setParameterList("
nameList"
names);
Listcats=q.list();
分页
fromDomeccat"
q.setFirstResult(20);
q.setMaxResults(10);
集合过滤器是一种用于一个持久化集合或者数据的特殊查询,
CollectionblackKittens=session.createFilter(pk.getKittens(),"
wherethis.color=?
).setParmeter(Color.Black,
Hibernate.custom(ColorUserType.class)).list()
可以不使用from,同时也可以设置返回结果
使用原生的SQL的查询
可以使用session.Connection()来获取JDBCConnection对象
也可以使用
Listcats=session.createSQLQuery("
SELECT{cat.*}FORMCAT{car}WHEREROWNUM<
10"
cat"
Cat.class).list();
进行直接的SQL语句调用,比如把sql别名用{}大括号包围起来
可以使用session.flush()把当前session中的数据进行刷新
如果使用native方式生成的ID(主键)他们一执行save就会被插入
拦截器--功能更类似与触发器,用于在Hibernate触发操作的时候自动调用
分为两个级别session和sessionfactory
通过继承EmptyInterceptor类来实现.加载到Session的方法,在openSession的方法中传入new接口实现类()进行注册
也可以使用在newConfiguration().setInterceptor(newAuditInterceptor())来注册SessionFactory级别的拦截器
同样也可是用事件系统来代替拦截器,或者作为拦截器的补充
可以用编程的方式和xml来注册事件
其中编程的方法可以共享一个实例
比如loadEvent需要实现LoadEventListener
Configurationcfg=newConfiguration();
LoadEventListener[]stack={newMyloadListener(),newDefaultLoadEventListener()};
cfg.EventListeners().setLoadEventListeners(stack);
其中第一个为接口实现类,第二个为接口
批量插入(Batchinserts)
在循环添加的时候.使用session.flush()和session.clear()进行内存的释放,最好的和JDBC批量设置相同如下
hibernate.jdbc.batch_size=20
也可以在批量处理时关闭二级缓存
hibernate.cache.use_second_level_cachefalse当不是必须的,还有其他的方法
同样更新的时候也适合于清空内存
HQL查询
最简单的就是form实体类名也可以使用as取别名,不过可以省略
也可以使用,分开进行多表查询
关联的方式
innerjoin内连接
leftouterjoin左外连接
rightouterjoin右外连接
fulljoin全连接不常用
其中可以简写去掉outer
也可以使用with关键字提供而外的join条件
fromCatascatleftjoincat.kittensaskittenwithkitten.bodyWeight>
10
fetch连接允许使用一个选择语句相一组集合随着他们父对象的初始化而初始化,有效的代替了配置文件中的外连接和延迟声明
fromCatascatinnerjoinfetchcat.mateleftjoinfetchcat.kittens
不过不可以和独立的with条件以及setMaxResult等一起使用
join的语法包括显示和隐式的两种,在HQL中直接写入的为显式,使用多个.个进行属性编写的为隐式,都会在生成的SQL中加入join
查询语句可以返回多个对象或属性,存放在Object[]队列中,也可以存放在一个list或者一个对象中(自定义的构造函数)下面描述例子
selectnewlist(属性,属性...)
selectnewFamily(属性,属性,属性);
这个尤其比较有用
也可以直接在HQL里面写上SQL的统计函数,并且封装成Map对象
selectnewmap(max(属性)asmax,min(bodyWeight)asmin,count(*)asn)fromCatcat
其中会生成别名为key的键值对map
聚集函数---上面说到的SQL统计函数
受支持的聚集函数如下
avg(..)sum()min()max()count()count(distinct...)count(all...)
多态查询,当进行一个父类查询的时候,会返回子类的实例,或者实现了该接口的实例
fromjava.lang.Objecto将返回所有的对象
在HQl中的=运算符可以直接用来比较对象
特殊属性的小写id可以作为对象的标识符(主键)也可以使用在符合主键里面id.子组件属性名
特殊属性的class用于在多态查询的时候指定一个实例鉴别来保存对象
fromCatcatwherecat.class=DomesticCat
表达式...非常多
常用的有in('
'
'
)和between'
a'
and'
b'
特殊属性size(属性)用于测试一个集合的大小
fromCatcatwheresize(cat.kittens)>
0
或者fromCatcatwherecat.kittens.size>
对于有序索引下的集合可以使用minelement与maxelement函数来引用其中的一个最大值或最小值
在集合的查询中可以使用更多的关键字,不过都只能使用where子句中
包括了anysomeallexistsin专用与集合的条件
或者结构变量size,elements,indices,minindex,maxindex,minelements
也可以使用[]进行组合的操作(查询结果的数组)
like子句用于实现模糊查询可以使用upper(属性)进行字母的大小化处理like'
FRI%'
%%%'
都可以
也可以使用orderby对象.属性asc,...进行排序,可以进行多次排序desc也可以
groupby进行分组
注意groupby和orderby子句不能包含算术运算符
子查询
通常和SQL聚集函数一起使用,需要用()括号包围起来
fromDomeascatwherecat.namenotin(selectname.nickNameformNameasname);
注意HQL子查询只能在where或者select子句中出现
也可以使用复杂的子查询
fromCatascatwherenot(cat.name,cat.color)in(selectcat.name,cat.colorfromDomesticCatcat);
统计查询结果不用初始化集合
((Integer)session.iterate("
selectcount(*)from...."
).next()).intValue();
使用JavaBean的属性简化命名查询:
name格式的Query生成
Queryq=s.createQuery("
fromFooasfoowherefoo.name=:
nameandfoo.size=:
size"
q.setProperties(fooBean);
//foobean包含了方法getName()与getSize();
Listfoos=q.list()
使用集合与过滤器一起使用,集合是可以分页的....不太懂
Queryq=s.createFilter(collection,"
q.setMaxResults(PAGE_SIZE);
q.setFirstResult(PAGE_SIZE*pageNumber);
Listpage=q.list();
条件查询QBC
创建一个Criteria实例
Criteriacrit=session.createCriteria(Cat.class);
crit.setMaxResults(50);
Listcats=crit.list()
使用Session创建一个Criteria接口的实例
限制结果集内容
Restrictions类定义了获取某些内置Criterion类型的工厂方法
Criteriacrit=session.createCriteria(Cat.class)
.add(Restrictions.like("
Friz%"
))//模糊查询
.add(Restrictions.between("
weight"
minWeight,maxWeight))
.list();
约束可以按逻辑分组
Listcats=sess.createCriteria(Cat.class)
.add(Restricrions.like("
Fir%"
))
.add(Restrictions.or(
Restrications.eq("
age"
newInteger(0)),
Restrictions.isNull("
)).list();
也可以直接使用SQL
.add(Restrictions.sqlRestriction("
lower({alias}.name)likelower(?
),"
Frix%"
Hibernate.STRING"
.list();
Property实例是获取一个条件的另外一种途径
Propertyage=Property.forName("
Listcats=sess.createCriteria(Cat.calss)
.add(Restrications.disJunction()
.add(age.isNull())
.add(age.eq(newInteger(0)))
)).add(Property.forName("
).in(newString[]{"
fize"
Izi"
}))
结果集排序
使用Order类或者接口
Listcats=session.createCriteria(Cat.class)
F%"
.addOrder(Order.asc("
.addOrder(Order.desc("
.setMaxResults(50)
同样也是用
addOrder(Property.forName("
).asc())来代替
关联多个实体用于建立约束
f%"
.createCriteria("
kittens"
.add(Restrictions.like("
.ResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP)增加结果的条件预过滤
动态关联抓取使用setFetchMode()在运行时定义动态关联抓取
Fri%"
.setFetchMode("
mate"
FetchMode.EAGER)
这个例子是通过外连接来抓取两个属性
使用Example类,允许通过一个给定实例构建一个条件查询....就是findByExample()
Catcat=newCat();
cat.setSex('
F'
Listresults=session.createCriteria(Cat.class)
.add(Example.create(cat))
可以自行调整Example使之更实用....通过对Example实例的操作
Exampleexample=Exam.create(cat)
.excludeZeroes()
.excludeProperty("
color"
.enableLise();
.add(example)
使用Projection进行SQL聚合函数的使用
.setProjection(Projections.rowCount())
.add(Restrictions.eq("
Color...))
.list()
也可以同时添加多个Projections
.setProjection(Projections.projectionlist()
.add(Projections.rowCount())
.add(Projections.avg("
.add(Projections.max("
.add(Projections.grunpProperty("
).list()
可以使用alias()和as()方法简便的将一个投影实例取个别名,宫其他实例引用
.setProjection(Projections.groupProperty("
).as("
colr"
.addOrder(Order.asc("
同样在添加到投影列表的时候
.setProjection(Projections.projectionList()
.add(Projections.rowCount(),"
别名"
.addOrder(Order.desc("
DetachedCriteria类用于在一个session范围之外创建一个查询,并且可以使用任意的Session来执行
DetachedCriteriaquery=DetachedCriteria.forClass(Cat.class)
.add(Property.forName("
sex"
).eq('
));
然后在session中
Listresults=query.getExectableCriteria(session).setMaxResulets(100).list()
原生的NativeSQL查询
对原生SQL查询执行的控制通过SQLQuery接口进行,通过执行Session.createSQLQuery()获取这个接口
最基本的SQL查询模式
session.createSQLQuery("
SELECT*FROMCATS"
).list();
将返回一个Object数组(Object[])组成的List
也可以指定返回的类型,以及返回的数量
.addScalar("
ID"
Hibernate.LONG)
NAME"
Hibernate.STRING)
BIRTHDATE"
Hibernate.DATE);
这个语句仅仅会返回这三个字段
也可以使用addEntity()让原生查询返回实体对象
).addEntity(Cat.class);
同样也可以在SELECT语句里面指定返回的属性,然后进行部分封装
均返回一个List
使用addJoin("
对象.外键对象属性"
用于减少数据库开销
同样也可以使用在返回多个实体的情况下
SELECT{c.*},{m.*}FROMCATSc,CATSmWHEREc.MOTHER_ID=c.ID"
.addEntity("
Cat.class)
mother"
尤其注意加上{}为了避免两个实体内相同的属性名
返回非受管实体(Returningnon-managedentities).使用ResultTransformer
SELECTNAME,BIRTHDATEFROMCATS"
.serResultTransformer(Transformers.aliasToBean(CatDTO.class))
会查询出指定的值,并注入到对应的属性中
在原生的SQL查询中,可以使用query.setString设置对应的参数包括了?
和:
两种
存储过程的调用
对于存储过程的查询无法使用setFirstResult或者setMaxResults()进行分页查询
其他没有详细的说明
抓取策略
可以在ORM映射的元数据中声明,也可以特定的HQL或者QBC语句中重载声明
hibernate.default_batch_fetch_size用于设置批量抓取的优化
通常的情况下不对抓取策略进行定制,更多的是,保持其默认值,然后在特定的事务中,使用HQL的左外连接抓取(leftjoinfetch)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- hibernate API笔记 API 笔记
![提示](https://static.bingdoc.com/images/bang_tan.gif)