Hibernate 的查询语言 Criteria 和Query

crieria.uniqueResult();代表结果唯一取出结果
lazy加载,只要不适用就不进行加载(根据配置文件的策略)
有时要覆盖配置文件的策略-------左连接的引入《》

 

两个检索语句同时写代表and关系
sql1  and  sql2 、
Expression.eq  等于
Expression.alleq
Expression.gt  大于
Expression.in 需要一个集合add(Expression.in())
Set set =new TreeSet();
set.add(new Integer(3));
set.add(new Integer(2));


in的用法
crieria.add(Expression.in("id",set));查询id在2和3之间的数据,or
第二种写法       
crieria.add(Expression.or(Expression.eq("id",new Integer(1)),Expression.eq("id",new Integer(1))))

and操作
crieria.add(Expression.add(lhs,rhs))

模糊操作
crieria.add(Expression.like("name","%s%"))

 Hibername 的分页技术
crieria.setFirstResult(2);
crieria.setMaxResult(2);
List list =crieria.list();
list 中就是第二页的list集合

Criteria只能对一个对象进行查询(当查询条件比较动态的时候)  所以引入query

  HQL语句查询
hql的语句有Hibernate来完成,查询的也是对象
可以把关系的表在内存中模拟成为封装好的面向对象的数据库,所以直接可以看过查询对象

实体查询
String hql="from Demo a where a.id=1";//类名字和属性名字如Demo需要区分大小写,而关键字from不区分大小写
Query query=session.createQuery(hql);

属性查询(需要select)
如果只想取出属性中的一部分就需要用到select了,select user.name from User user。
String hql="select n.name,n.id from Demo n ";
Query query=session.createQuery(hql);
List list=query.list;
for(int i=0;i<list.length;i++)
Objext[] vv=(Object[])list.get(i);
System.out.println((String)vv[0]);
System.out.println((Integer)vv[1]);


String hql="select new Demo(n.name) from Demo n ";前提是Demo中有个参数是String的构造方法

删除操作

hql="delete from Demo where name='lisi'"
Query query=session.createQuery(hql);
query.executeUpdate();//需要使用Update
trx.commit();(commit中包括一个session.flush())
当数据行数很多的时候
int num=query.executeUpdate();
if(num%25==0)
session.flush();
意思是每25行进行一次操作


 如何写sql语句中的count(*)
String hql ="select count(a.id) from Room"
Query query=session.createQuery(hql);
Object o=query.uniqueResult();取出的结果应该是一个long的数值
Integer num=(Long)o;
System.out.println(num.longValue());

 

 实现连接查询(Test30)
String hql ="from Room a left join a.stuSet b where a.id=1"(Room和学生的集合想关联)
这时候检索出来的是数组,list中每一个都是一个数组0是Room,而1是Student,有多少个学生就会有多少条记录
for(int i=0;i<list.size();i++)
{
Object[] vv=(Object[])list.get(i);
Room room=(Room) vv[0];
Student stu=(Student) vv[1];
}


 加入关键字fetch(Test31)迫切左外连接
from Room a left join fetch a.stuSet b where a.id=1

这时就直接取出一个Room对象,在Room的stu集合中是有数据的
这个fetch会覆盖掉配置中的lazy属性


 填充数据,类似preparestatement
方法1.“from User user where user.name=? And user.age=?”
Query query=session.createQuery


方法2...........................

 

 

 


总结
criteria适合对一个对象进行查血 只能进行检索 动态的实现条件查询

作业:建立以学生的表(超多属性)复杂查询的分页语句

query
  select update delete
实体查询 from 属性检索 select
left outer join
left outer join fetch

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值