版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/luckily_star/article/details/80664659
Criteria 通用规则
Criterrion 部分规则 自定义
Restrictions 限制条件
Projection 投影(返回Object数组)
运算符号
= eq
!=ne
>gt
<lt
>=ge
<=le
in
is null
is not null
查询所有
@Test
public void queryAll(){
Criteria criteria=s.createCriteria(Product.class);
// Criteria criteria=s.createCriteria("com.oracle.entity.Product");//方法2
List<Product> list=criteria.list();
for (Product p:list){
System.out.println(p.getPname());
}
}
分页
criteria.setFirstResult(0);
criteria.setMaxResult(3);
@Test
public void queryByPage(){
Criteria criteria=session.createCriteria(Product.class);
criteria.setFirstResult(0);
criteria.setMaxResults(3);
List<Product> list=criteria.list();
for (Product p:list){
System.out.println(p.getPname());
}
}
排序
criteria.add(Restrictions.gt("属性",条件))
排序
criteria.addOrder(Order.desc("属性"));
@Test
public void queryAll3(){
Criteria criteria=session.createCriteria(Product.class);
criteria.addOrder(Order.desc("salecount"));//paixu
criteria.addOrder(Order.asc("collect"));
/**
*多个条件排序
**/
SimpleExpression expression1= Restrictions.lt("salecount",7l);//< 属性 条件
SimpleExpression expression2=Restrictions.gt("collect",5l);//>
criteria.add(Restrictions.and(expression1,expression2));
criteria.setFirstResult(0);
criteria.setMaxResults(3);
List<Product> list = criteria.list();
for (Product p:list){
System.out.println(p.getPname());
System.out.println(p.getSalecount());
System.out.println(p.getCollect());
}
}
多个条件排序
规则:二次排序 先按第一个条件进行排序 如果第一次没有相同的数据 第二个条件不起作用;如果第一次有相同的数据 第二次只排重复的按第二个条件进行排序
模糊查询
criteria.add(Restrictions.like("属性","%条件%"))
@Test
public void queryByLike(){
Criteria criteria=session.createCriteria(Product.class);
criteria.addOrder(Order.desc("salecount"));//排序
criteria.addOrder(Order.asc("collect"));
criteria.add(Restrictions.like("pname","%小米%"));
List<Product> list=criteria.list();
for (Product p:list){
System.out.println(p.getPname());
System.out.println(p.getCollect());
System.out.println(p.getSalecount());
}
}
投影查询
@Test
public void queryAllByProject(){
Criteria criteria=session.createCriteria(Product.class);
criteria.addOrder(Order.desc("salecount"));
criteria.addOrder(Order.asc("collect"));
ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.property("pname"));
projectionList.add(Projections.property("salecount"));
projectionList.add(Projections.property("collect"));
criteria.setProjection(projectionList);
List<Object[]> list=criteria.list();
for (Object[] o:list){
System.out.println(o[0]);
System.out.println(o[1]);
System.out.println(o[2]);
}
}
分组查询 不支持having
Projections.groupProperty("属性")
/**
* 分组=合并 把相同的数据合并为一条 一个字段 多个字段来分组
* SELECT SALECOUNT,USID,count(SALECOUNT) FROM TPRODUCT GROUP BY SALECOUNT,USID
* 在QBC中不支持having 查询 自己通过java代码去过滤
*/
@Test
public void queryAllByGroup(){
Criteria criteria=s.createCriteria(Product.class);
ProjectionList projectionList=Projections.projectionList();
//分类
projectionList.add(Projections.groupProperty("salecount"));
//对象
projectionList.add(Projections.groupProperty("user"));
projectionList.add(Projections.count("salecount"));
criteria.setProjection(projectionList);
List<Object[]> list=criteria.list();
for (Object[] o:list){
System.out.println(o[0]);
System.out.println(((User)o[1]).getPk());
System.out.println(o[2]);
}
}
多表查询
Criteria criteria=s.createCriteria(类名.class);
左外连接
criteria.createCriteria("想要连接的类名",JoinType.LEFT_OUTER_JOIN);
/**
* SELECT T.*,C.CNAME FROM TPRODUCT T LEFT JOIN TCATALOG C ON T.CID=C.PK
* 左连接
*/
@Test
public void queryallbyleftjoin(){
Criteria criteria = s.createCriteria(Product.class);
criteria.createCriteria("catalog", JoinType.LEFT_OUTER_JOIN);
List<Product> list=criteria.list();
for (Product p:list){
System.out.println(p.getPname());
System.out.println(p.getCatalog().getCname());
}
}
内连接
criteria.createCriteria("想要连接的类名",JoinType.INNER_JOIN);
/**
* SELECT T.*,C.CNAME FROM TPRODUCT T LEFT JOIN TCATALOG C ON T.CID=C.PK
* 一般来说 开发的是hibernate 连接查询没有意义 类和类本身存在关联关系
* 查询 Fetch的规则 抓取策略 去查询 即时加载 (一条多表查询的sql) 懒加载(只发一条sql)
*/
@Test
public void queryallbyinnerjoin(){
Criteria criteria = s.createCriteria(Product.class);
criteria.createCriteria("catalog", JoinType.INNER_JOIN);
List<Product> list=criteria.list();
for (Product p:list){
System.out.println(p.getPname());
System.out.println(p.getCatalog().getCname());
}
}