1、动态实例查询:在查询表属性不全时返回的不是实体类的对象,而是Object[],这时将查询的属性封装到一个实体类对象中,即动态实例查询
String hql="select new Books(b.title,b.author) from Books as b";需要在Books实体类中添加这个构造方法public Books(String title,String author){ this.````````}
2、分页查询:
setFirstResult(int firstResult):设定查询对象的起始位置,0
setMaxResult(int maxResult):设定每次查多少对象,默认查所有
public void pagedSearch(int pageIndex,int pageSize){
````
int firstResult=(pageIndex-1)*pageSize;//页码从第一页开始,每页从0开始
query.setFirstResult(firstResult);
query.setMaxResult(pageSize);//页面大小设置为每次查询最大值
}
3、条件查询:
按参数位置查询:HQL中使用? query设置参数值 setString()等
按参数名字查询:HQL中定义“命名参数”,命名参数以:开头,如String hql="from Books books where books.title=:bookTitle";
再在下面用query赋值:query.setString("bookTitle","Qt高级编程"); //记得bookTitle加引号哦!!
4、连接查询:
内连接:String hql="from Books b inner join b.publishers p where p.name='xxxxxx'"; obj=(Object[])itor.next(); book=(Books)obj[0];
左外连接:String hql="from Books b left join b.publishers p where p,name='xxxxx'";右连接类似
交叉连接:HQL中内外连接主要为关联类连接查询,对于相互无关的对象,可以使用交叉连接进行查询。
String hql="from People p,Users u where p.id=u.id";
5、子查询
相关子查询:子查询使用外层查询中的对象别名:String hql="from Publishers p where (select count(*) from p.books)>1";
无关子查询:子查询与外层查询语句无关:String hql="from Books b where b.unitPrice<(select avg(b1.unitPrice) from Books b1)";
6、使用Restrictions辅助类,进行Criteria查询的基本步骤
(1)获取Session
(2)创建Criteria对象
(3)使用Restrictions对象编写查询条件,并将查询条件加入Criteria对象
(4)执行查询,获得结果
例:Criteria criteria=session.createCriteria(Books.class);
criteria.addOrder(Order.asc("id"));
List list=criteria.list();
分组查询:
Criteria criteria=session.createCriteria(Books.class);
ProjectionList pList=Projections.projectionList();
pList.add(Projections.groupProperty("publishers"));
pList.add(Projections.rowCount);
criteria.setProjection(pList);
List list=criteria.list();
内置聚集函数:
public void testCriteria_3(){
Session session=HibernateSessionFactory.getSession();
Criteria criteria=session.ceateCriteria(Books.class);
ProjectionList pList=Projections.projectionList();
pList.add(Projections.sum("unitPrice"));
pList.add(Projections.avg("unitPrice"));
criteria.setProjection(pList);
List list=criteria.list();
}
组合查询:通过Restrictions工具类的响应方法动态构造查询条件,并将查询条件加入Criteria对象
public void testCriteria_4(Books condition){
Session session=HibernateSessionFactory.getSession();
Criteria criteria=session.createCriteria(Books.class);
//使用Restrictions对象编写查询条件,并将查询条件加入Criteria对象
if(condition!=null){
if(condition.getTitle()!=null && !condition.getTitle().equals("")){
//按书名进行筛选
criteria.add(Restrictions.like("title",condition.getTitle(),MatchMode.ANYWHERE));
}
if(condition.getAuthor()!=null && !condition.getAuthor().equals("")){
//按作者进行筛选
criteria.add(Restrictions.like("author", condition.getAuthor(), MatchMode.ANYWHERE));
}
}
List list=criteria.list();
Iterator itor=list.iterator();
while(itor.hasNext()){
Books book=(Books)itor.next();
System.out.println("书名:"+book.getTitle()
+"作者名:"+book.getAuthor());
}
}
关联查询:
public void testCriteria_5(){
Session session =HibernateSessionFactory.getSession();
Criteria bookCriteria=session.createCriteria(Books.class);
//设置从Books类中查询的条件
bookCriteria.add(Restrictions.like("title", "Qt",MatchMode.ANYWHERE));
//创建一个新的Criteria实例,以引用publishers集合中的元素
Criteria publishersCriteria=bookCriteria.createCriteria("publishers");
//设置从关联的Publishers类中查询的条件
publishersCriteria.add(Restrictions.like("name", "电子工业出版社"));
List list=publishersCriteria.list();
Iterator itor=list.iterator();
while(itor.hasNext()){
Books book=(Books)itor.next();
System.out.println("书名:"+book.getTitle()
+"作者:"+book.getAuthor());
}
}
创建Criteria对象和使用Restrictions对象编写查询条件,可以采用方法链编程风格:
public void testCriteria_5_1(){
Session session=HibernateSessionFactory.getSession();
List list=session.createCriteria(Books.class).add(Restrictions.like("title","C++",MatchMode.ANYWHERE)).
createCriteria("publishers").add(Restrictions.like("name","出版社")).list();
Iterator itor=list.iterator();
```
}
分页查询:使用Criteria并通过Restrictions工具类,实现分页查询
public void testCriteria_6(){
Session session=HibernateSessionFactory.getSession();
Criteria criteria=session.createCriteria(Books.class);
//从第一个对象开始查询
criteria.setFirstResult(0);
criteria.setMaxResults(4);
List list=criteria.list();
```
}
QBE查询:(Query By Example)举例查询,示例查询,由于QBE查询检索与指定示例对象具有相同属性值的对象,因此示例对象的创建是QBE查询关键。
public void testCriteria_7(Books condition){
Session session=HibernateSessionFactory.getSession();
Criteria criteria=session.createCriteria(Books.class);
//使用Example工具类创建示例对象
Example example=Example.create(condition);
//设置匹配模式为ANYWHERE
example.enableLike(MatchMode.ANYWHERE);
//设置不区分大小写
example.ignoreCase();
//为Criteria对象指定示例对象example作为查询条件
criteria.add(example);
List list=criteria.list();
```
}