Hibernate的种查询方式
qbe、qbc和hql
先来解释一下什么是Criteria
Criteria面向对象化查询接口,将数据查询条件封装为一个对象,可以把它看成传统SQL的对象化表示
这个是测试的主函数
public void test() {
Session session=HibernateSessionFactory.getSession();
// qbesel(session);//qbe查询最简单的,功能是最弱的
// qbcselExpression(session);//qbc Expression对象查询,现在不推荐使用
// qbcselRestrictions(session);//qbc Restrictions对象查询,推荐使用
// qbcselallEq(session);//qbc Restrictions.allEq(map);查询,相当于eq
// qbcselgt(session);//qbc Restrictions.gt() ge() 大于参数的
// qbcsellt(session);//qbc Restrictions.lt() le() 小于参数的
// qbcselbetween(session);//qbc Restrictions.between 在什么之间
// qbcsellike(session);//模糊查询
// qbcselin(session);//in() 在这个集合内
// qbcseland(session);//此方法等同and
// qbcselor(session);//or 或者
// qbcselisNull(session);//判断属性是否为空
// qbcseldesc(session);//desc 升序排序
// qbcseldPage(session);//分页
// qbcseldCount(session);// 函数分组类型
HQl(session);//hql 查询
}ln(c.list());
}
输出结果函数
//输出方法
public void println(List<Items> list){
for (Items items : list) {
System.out.println(items.getName());
}
}
QBE查询(Query By Example) QBE是最简单的,但是功能也是最弱的,QBE的功能不是特别强大,仅在某些场合下有用
public void qbesel(Session session){
Criteria c=session.createCriteria(Items.class);//获取一个查询容器
Items i=new Items();//设置查询条件
i.setName("小米2S");
c.add(Example.create(i));//往容器里面加入Example对象
println(c.list());
}
QBC (Query By Criteria) 主要有Criteria,Criterion,Oder,Restrictions类组成
主要有两大类
Expression具体描述查询条件,针对SQL语法,Expression提供了对应的查询限定机制(现在不推荐使用)
Restrictions 与Expression一样,替代
Expression
public void qbcselExpression(Session session){
Criteria c=session.createCriteria(Items.class);
c.add(Expression.eq("name", "小米2S"));///第一个参数:数据库列名,第二个参数:查询的数据
c.add(Expression.eq("id", 7));//可以加多个查询条件 相当于where ** and **
println(c.list());
}
Restrictions
public void qbcselRestrictions(Session session){
Criteria c=session.createCriteria(Items.class);
c.add(Restrictions.eq("name", "小米2S"));///第一个参数:数据库列名,第二个参数:查询的数据
c.add(Restrictions.eq("id", 7));//可以加多个查询条件 相当于where ** and **
println(c.list());
}
QBC常用限定方法
Restrictions.eq --> equal,等于.
Restrictions.allEq --> 参数为Map对象,使用key/value进行多个等于的比对,相当于多个Restrictions.eq的效果
public void qbcselallEq(Session session){
Criteria c=session.createCriteria(Items.class);
Map<String,Object> map=new HashMap<String, Object>();
//参数为Map对象,使用key/value进行多个等于的比对,相当于多个Restrictions.eq的效果
map.put("name", "小米2S");
map.put("id", 7);
c.add(Restrictions.allEq(map));//sql where (this_.name=? and this_.id=?)
println(c.list());
}
Restrictions.gt --> great-than > 大于
public void qbcselgt(Session session){
Criteria c=session.createCriteria(Items.class);
//gt :大于 (表列名 ,查询的值) ge:大于等于 (表列名 ,查询的值)
c.add(Restrictions.gt("id", 10));//sql where this_.id>?
println(c.list());
}
Restrictions.lt --> less-than, < 小于
public void qbcsellt(Session session){
Criteria c=session.createCriteria(Items.class);
//lt :小于 (表列名 ,查询的值) le:小于等于 (表列名 ,查询的值)
c.add(Restrictions.lt("id", 10));//sql where this_.id<?
println(c.list());
}
Restrictions.between --> 对应SQL的between子句
public void qbcselbetween(Session session){
Criteria c=session.createCriteria(Items.class);
//between :在什么什么之间 (表列名 ,查询的值,查询的值)
c.add(Restrictions.between("id", 1,5));//sql where this_.id between ? and ?
println(c.list());
}
Restrictions.like --> 对应SQL的LIKE子句
public void qbcsellike(Session session){
Criteria c=session.createCriteria(Items.class);
//like 模糊查询 (表列名 ,查询的值)
c.add(Restrictions.like("name", "%小米%"));//sql where this_.name like ?
println(c.list());
}
Restrictions.in --> 对应SQL的in子句
public void qbcselin(Session session){
Criteria c=session.createCriteria(Items.class);
//in 在这个集合内的数据 (表列名 ,数组)
c.add(Restrictions.in("id", new Object[]{1,4,5,9}));//sql where this_.id in (?, ?, ?, ?)
println(c.list());
}
Restrictions.and --> and 关系 Restrictions.and(cr1,cr2)//等同与sql语句的and关键字,使用and来连接两个条件
public void qbcseland(Session session){
Criteria c=session.createCriteria(Items.class);
//and 此方法等同and (表列名 ,要and查询的条件)
c.add(Restrictions.and(Restrictions.like("name", "%小米%"), Restrictions.in("id", new Object[]{1,4,6,9})));
//sql where (this_.name like ? and this_.id in (?, ?, ?, ?))
println(c.list());
}
Restrictions.or --> or 关系//等同与sql语句的or关键字,使用or来连接两个条件
public void qbcselor(Session session){
Criteria c=session.createCriteria(Items.class);
//or 或者 (表列名 ,要and查询的条件)
c.add(Restrictions.or(Restrictions.like("name", "%小米%"), Restrictions.in("id", new Object[]{1,4,6,9})));//sql where (this_.name like ? or this_.id in (?, ?, ?, ?))
println(c.list());
}
Restrictions.isNull --> 判断属性是否为空,为空则返回true
public void qbcselisNull(Session session){
Criteria c=session.createCriteria(Items.class);
//isNull 判断列名是否为空 (查询的列) 相反的是isNotNull
c.add(Restrictions.isNull("name"));//sql where this_.name is null
println(c.list());
}
Order.asc --> 根据传入的字段进行升序排序
public void qbcseldesc(Session session){
Criteria c=session.createCriteria(Items.class);
//desc 升序排序 (查询的列) 相反的是asc
c.addOrder(Order.desc("id"));//sql order by this_.id desc;
println(c.list());
}
QBC分页和排序
Criteria.setFirstResult(100);//从第几条显示
Criteria.setMaxResults(20); //显示几条public void qbcseldPage(Session session){
int nowPage=1;
int pageSize=4;
Criteria c=session.createCriteria(Items.class);
//起始条数
c.setFirstResult((nowPage-1)*pageSize);
//一页最大条数
c.setMaxResults(pageSize);//sql this_ limit ?
println(c.list());
}
QBC
分组与统计
Projections.count();
Projections.avg();
Projections.max();
Projections.min();
Projections.groupProperty(“age”);
public void qbcseldCount(Session session){
Criteria c=session.createCriteria(Items.class);
//count 函数 (列名) avg() max() min() groupProperty() 分组
c.setProjection(Projections.count("id"));//sql count(this_.id)
System.out.println(c.list().get(0));
}