criteria的具体配置想了解的可以看我的前文
https://blog.csdn.net/weixin_40496191/article/details/105087594
接下来直接讲讲关于criteria的语句使用经验
- 等于(equal)
c.add(Restrictions.eq("name","樱桃"));
- 小等于(less equal)
c.add(Restrictions.le("id", 3));
- 小于(less than)
c.add(Restrictions.lt("id", 3));
- 大等于(greater equal)
c.add(Restrictions.ge("id", 3));
- 大于(greater than)
c.add(Restrictions.gt("id", 3));
- 日期比较
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
c.add(Restrictions.gt("time", sdf.parse("2020-03-15")));
- key/value装入集合进行等于对比
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", "小苹果");
map.put("id", 1);
c.add(Restrictions.allEq(map));// 小苹果、大苹果
- 模糊查询
c.add(Restrictions.like("name","%苹果%"));
- 范围
c.add(Restrictions.between("id", 1, 3));
c.add(Restrictions.in("id", new Object[]{1,2}));
- 不为空/为空
c.add(Restrictions.isNotNull("name"));
c.add(Restrictions.isNull("name"));
- 分页(指定从哪条开始、查询的条数)
c.setFirstResult(0);
c.setMaxResults(3);
- 排序
c.addOrder(Order.asc("time"));
c.addOrder(Order.desc("time"));
- 两表关联(需要jpa提供支持,暂未研究)
Criteria user = c.createCriteria("User");
user.add(Restrictions.eq("name", "小白白"));
- 多个查询条件or或者and连接一起
c.add(Restrictions.or(Restrictions.gt("id", 3), Restrictions.gt("id",4)));
c.add(Restrictions.and(Restrictions.gt("id", 3),Restrictions.gt("id", 4)));
- 查询返回固定的字段
c.setProjection(Projections.projectionList().add(Projections.property("id")).add(Property.forName("name")));
List<Object> ps = c.list();
- 查询总记录数
c.setProjection(Projections.rowCount());
Integer count = (Integer) c.uniqueResult();
- 查询某列的数量
c.setProjection(Projections.count("price"));
Integer count = (Integer) c.uniqueResult();
- 查询某列剔除重复数据后的数量
c.setProjection(Projections.countDistinct("price"));
Integer countDistinct = (Integer) c.uniqueResult();
- 查询某列平均、求和、最大、最小值
c.setProjection(Projections.sum("price"));
c.setProjection(Projections.avg("price"));
c.setProjection(Projections.max("price"));
c.setProjection(Projections.min("price"));
List<Long> ps = c.list();
- 将数据按照price进行分组,查询数量
c.setProjection(Projections.projectionList()
.add(Projections.groupProperty("price"))
.add(Projections.count("id")));
List<Object> ps = c.list();
- hql查询(类、数量、指定字段)
List<Product> ps=s.createQuery("from Product").list();
List<Long> ps=s.createQuery("select count(id) from Product").list();
List<Object> ps=s.createQuery("select id,name from Product").list();
- 关于查询结果集的类型转换
//投影,即只需要返回列表中指定字段的信息,返回类型根据查询条件。如果不投影,结果则会被封装在实体类中
//但是我们可以手动将结果集进行转换,criteria提供了转换的接口
// c.setResultTransformer(ResultTransformer resultTransformer)
c.setProjection(Projections.projectionList()
.add(Projections.property("id").as("id"))
.add(Property.forName("name").as("name")));
c.setResultTransformer(new AliasToBeanResultTransformer(Product.class));
List<Product> ps = c.list();
- 添加自定义的sql语句
c.add(Restrictions.sqlRestriction("id>price"));
c.add(Restrictions.sqlRestriction("id>3"));
结束!