Hibernate 数据检索
User==>实体名 Address==>实体名 他们之间的关系是一对多
一 : Criteria
1.示例查询:查询出跟数据库相同属性的记录
Criteria criteria = session.createCriteria(User.class);
User exampleUser = new User();
exampleUser.setName("Eria");
criteria.add(ExampleUser.create(exampleUser));
List list = criteria.list();
2.复合查询:例如查询出地址为shanghai的所以用户
Criteria criteria = session.createCriteria(User.class);
Criteria addCriteria = criteria.createCriteria("address"); //address是User的一个集合属性 addCriteria.add(Expression.like("address","%shanghai%"));
List list = criteria.list();
二: DetechedCriteria: Hibernate3中的,可以脱离session存在。在查询条件相同的情况下,可以做到代码的重用。
1. DetechedCriteria deCriteria = DetechedCriteria.forClass(User.class);
deCriteria.add(Expression.eq("name","Erica"));
deCriteria.add(Expression.eq("sex",new Integer(1)));
Criteria criteria = deCriteria.getExecutableCriteria(session);
List list = criteria.list();
2.DetechedCriteria也可用于子查询表达,例如所以年龄超过平均值的用户
DetechedCriteria avgAge= DetechedCriteria.forClass(User.class);
avgAge.setProjection(Projection.avg("age"));
Criteria criteria = session.createCriteria(User.class);
criteria.add(Subqueries.propertyGt("age",avgAge));
List list = criteria.list();
三:Criteria高级特性
1.限定返回的记录范围
criteria.setFirstResult(100);
criteria.setMaxRusults(20);
2.增加排序
criteria.addOrder(Order.asc("name"));
criteria.addOrder(Order.desc("id"));
3.分组与统计:由Hibernate 3 新引入的Projections Class进行封装
Criteria criteria = session.createCriteria(User.class);
criteria.setProjection(Projections.groupProperty("age"));
List list = criteria.list();
统计功能也可以通过Projections.avg(),rowCount(),count(),max(),min(),countDistict()等方法。
四:HQL查询 (也可以更新,删除 由Hibernate 3引入的新特性)
1.实体查找
hql:from User as user where user.name='Erica' (hql语言大小写无关,但涉及到类名和属性时,是有关系的)
String hql = "from User as user where user.name='Erica' ";
Query query = session.createQuery(hql);
List list = query.list();
2.属性查找
a)单个属性:
List list = session.createQuery("select user.name from User user").list();
这里的list是存放name属性的一个集合,不是user对象。
b)多个属性:
List list = session.createQuery("select user.name user.age from User user").list();
这里的list存放的是个Object[]对象。Object[0]放name属性, Object[1]放age属性。
如果觉得返回的对象不够复合面向对象的风格,可以用返回的属性构造出一个对象。例如:
List list = session.createQuery("select new User(user.name user.age) from User user").list();
但这里的User对象仅仅是个POJO类,不是什么实体对象。
c)在select 中使用统计函数或者原生SQL函数。返回的List存放的是个Object对象。例如:
List list = session.createQuery("select count(*),min(user.age) from User user").list();
List list = session.createQuery("select upper(user.name) from User user").list();
List list = session.createQuery("select distinct user.name from User user").list();
3.实体更新与删除
hql:update User set age=18 where id=1
query.executeUpdate();
hql:delete User where age>18
query.executeUpdate();
在使用HQL 的delete/update字句的时,必须特别注意它们对缓存策略的影响,delete/update字句极可能导致缓存同步上的障碍。
4.分组与排序
a)Order by 子句:
from User user order by user.name
from User user order by user.name desc
from User user order by user.name,user.age desc
b)Group by 字句:
select count(user) ,user.age from User user group by user.age
5.参数绑定
a)顺序占位符:
hql: "from User user where user.name=?"
Session.find方法(Hiberneta 2)中填充参数:
session.find("from User user where user.name=?","Erica",Hibernate.STRING);
多参数的情况:
Object[] args = new Object[]{"Erica",new Integer(20)};
Type[] types = new Type[]{Hibernate.STRING,Hibernate.INTEGER};
session.find("from User user where user.name=? and user.age>?",args,types);
通过Query接口进行参数填充:
Query query = session.createQuery("from User user where user.name=?");
query.setString(0,"Erica");
b)应用占位符:
Query query = session.createQuery("from User user where user.name=:nameP");
query.setParameter("nameP","Erica");(这里的方法与setString()有什么不同,手上暂时没有API).
还可以用一个bean进行封装数据:例如
Class UserQuery{
private String name;
private Integer age;
//getter...setter...
}
String hql = "from User user where user.name=:name1 and user.age=:age";
Query query = session.createQuery(hql);
UserQuery uq = new UserQuery();
uq.setName("Erica");
uq.setAge(new Integer(20));
query.setProperties(uq);
五:联合查询
1.inner join :返回所以符合条件的记录
sql:select … from T_User user inner join T_Address add on user.id=add.user_id;
hql:from User user inner join fetch user.addresses (这里没有fetch时,返回的是一个Object对象数组。
在这里,数组里将会有两个对象,一个是User,一个是Address。若有fetch时,返回的一个对象,自动的会把
Address对象注入到User的Set集合中);
2.left outer join 3.right outer join 4.full join(not usually useful)