您的位置:首页 > 产品设计 > UI/UE

Hibernate 的查询语言 Criteria 和Query

2010-05-21 21:20 375 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: