东家蝴蝶西家飞,白骑少年今日归。 愿,所有迷茫的人,都不再迷茫的,愿,所有努力工作的人,都可以得到应有的回报,愿,所有的人,都可以找到回家的方向,愿,再无苦痛,再无离别。

上一章简单介绍了Hibernat的HQL语句查询(十六),如果没有看过,​​请观看上一章​​

一. Criteria 查询

hql查询是用类似于Sql语句的形式进行相应的查询,Criteria 是用类的形式进行相应的处理。 所用的例子,是与HQL查询一样的。 具体例子,参考HQL语句。

二. 各种形式的Criteria 查询

二.一 查询全部

/*查询全部*/
@Test
public void test1(){
Session session=HibernateUtil.getSession();
//Hibernate推荐使用JPA的规范获取Criteria
Criteria criteria=session.createCriteria(User.class);
List<User> userList=criteria.list();
userList.forEach(n -> System.out.println(n));
session.close();
}

二.二 添加条件

@Test
public void test2(){
Session session=HibernateUtil.getSession();
Criteria criteria=session.createCriteria(User.class);
// 用Restrictions 进行相应的条件处理
criteria.add(Restrictions.eq("name","两个蝴蝶飞"));
criteria.add(Restrictions.gt("age",22));
List<User> userList=criteria.list();
userList.forEach(n -> System.out.println(n));
session.close();
}

二.三 like 链式形式

@Test
public void test3(){
Session session=HibernateUtil.getSession();
Criteria criteria=session.createCriteria(User.class);
criteria.add(Restrictions.like("name","%蝴蝶飞%")).add(Restrictions.ge("age",22));
List<User> userList=criteria.list();
userList.forEach(n -> System.out.println(n));
session.close();
}

二.四 分页查询

@Test
public void test4(){
Session session=HibernateUtil.getSession();
Criteria criteria=session.createCriteria(User.class);
//最开始的索引
criteria.setFirstResult((1-1)*2);
//每页显示的个数
criteria.setMaxResults(2);
List<User> userList=criteria.list();
userList.forEach(n -> System.out.println(n));
session.close();
}

二.五 排序

@Test
public void test5(){
Session session=HibernateUtil.getSession();
Criteria criteria=session.createCriteria(User.class);
criteria.setFirstResult((1-1)*2);
criteria.setMaxResults(2);
//criteria.addOrder(Order.asc("id"));
criteria.addOrder(Order.desc("id"));
List<User> userList=criteria.list();
userList.forEach(n -> System.out.println(n));
session.close();
}

二.六 聚集函数

@Test
public void test6(){
Session session=HibernateUtil.getSession();
Criteria criteria=session.createCriteria(User.class);
//criteria.setProjection(Projections.rowCount()); //会进行替换
criteria.setProjection(Projections.max("age"));
Object object=criteria.uniqueResult();
System.out.println(object);
session.close();
}

二.七 in 形式传参

@Test
public void test7(){
Session session=HibernateUtil.getSession();
Criteria criteria=session.createCriteria(User.class);
//criteria.add(Restrictions.in("id",new Object[]{1,2,3}));
criteria.add(Property.forName("id").in(new Object[]{1,4}));
List<User> userList=criteria.list();
userList.forEach(n -> System.out.println(n));
session.close();
}

二.八 sql形式传入值

@Test
public void test8(){
Session session=HibernateUtil.getSession();
Criteria criteria=session.createCriteria(User.class);
//criteria.add(Restrictions.sqlRestriction("age=?",24,StandardBasicTypes.INTEGER));
criteria.add(Restrictions.sqlRestriction("age=? and name like ?",new Object[]{24,"%蝴蝶飞%"},new Type[]{StandardBasicTypes.INTEGER,StandardBasicTypes.STRING}));
List<User> userList=criteria.list();
userList.forEach(n -> System.out.println(n));
session.close();
}

二.九 多种条件

@Test
public void test9(){
Session session=HibernateUtil.getSession();
Criteria criteria=session.createCriteria(User.class);
//名称为蝴蝶飞,或者性别为男,年龄>22
criteria.add(Restrictions.disjunction(
Restrictions.like("name","%蝴蝶飞%"),
Restrictions.conjunction(Restrictions.eq("sex","男"),Restrictions.gt("age", 22))));
List<User> userList=criteria.list();
userList.forEach(n -> System.out.println(n));
session.close();
}

其中,disjunction 表示或的形式, conjunction 表示与的形式。

二.十 JPA 规范形式

@Test
public void test10(){
Session session=HibernateUtil.getSession();
//Hibernate推荐使用JPA的规范获取Criteria
CriteriaBuilder criteriaBuilder=session.getCriteriaBuilder();
CriteriaQuery<User> criteriaQuery=criteriaBuilder.createQuery(User.class);
criteriaQuery.from(User.class);
Query<User> query=session.createQuery(criteriaQuery);
List<User> userList=query.getResultList();
userList.forEach(n -> System.out.println(n));
session.close();
}

二.十一 JPA形式加入条件

@Test
public void test11(){
Session session=HibernateUtil.getSession();
//Hibernate推荐使用JPA的规范获取Criteria
CriteriaBuilder criteriaBuilder=session.getCriteriaBuilder();
CriteriaQuery<User> criteriaQuery=criteriaBuilder.createQuery(User.class);
Root<User>user=criteriaQuery.from(User.class);
Predicate predicate=criteriaBuilder.gt(user.get("age"),24); //添加条件
criteriaQuery.where(predicate);
Query<User> query=session.createQuery(criteriaQuery);
List<User> userList=query.getResultList();
userList.forEach(n -> System.out.println(n));
session.close();
}

二.十二 离线查询

@Test
public void test12(){
DetachedCriteria detached=DetachedCriteria.forClass(User.class);
//DetachedCriteria detached=DetachedCriteria.forEntityName("com.yjl.pojo.User");
detached.add(Restrictions.eq("id",1));
Session session=HibernateUtil.getSession();
Criteria criteria=detached.getExecutableCriteria(session);
Object object=criteria.uniqueResult();
System.out.println((User)object);
session.close();
}

三. SQLQuery查询

三.一 普通查询

查询出来的是对象数组的集合。

@Test
public void test13(){
Session session=HibernateUtil.getSession();
SQLQuery query=session.createSQLQuery("select * from user");
List<Object[]> userList=query.list();
for (Object[] objects : userList) {
for (int i = 0; i < objects.length; i++) {
Object object = objects[i];
System.out.print(object+",");
}
System.out.println();
}
session.close();
}

三.二 条件SQL查询

@Test
public void test14(){
Session session=HibernateUtil.getSession();
SQLQuery query=session.createSQLQuery("select * from user where name like :name");
query.setParameter("name","%蝴蝶飞%");
List<Object[]> userList=query.list();
for (Object[] objects : userList) {
for (int i = 0; i < objects.length; i++) {
Object object = objects[i];
System.out.print(object+",");
}
System.out.println();
}
session.close();
}

谢谢!!!