Query 实例包装了一个 HQL(Hibernate Query Language)查询语句,HQL 查询语句与 SQL 查询语句有些相似,但 HQL 查询语句是面向对象的,它引用类名及类的属性名,而不是表名及表的字段名。
Critieria 接口完全封装了基于字符串形式的查询语句,比 Query 接口更加面向对象,Criteria 接口擅长于执行动态查询
package com.test;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;
import com.bean.User;
import com.util.HibernateUtil;
public class QueryAndCniteria {
private static SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
//1.1,简单绑定参数查询,不使用表名而使用类名,bean
//按参数位置绑定: 在 HQL 查询语句中用“?”来定义参数位置
@Test
public void query1(){
//1,获取session对象
Session session = sessionFactory.openSession();
//2,hql
Query query = session.createQuery("from User where name=? and age=? ");
//3,为?赋值
query.setString(0,"dada");
query.setInteger(1,11);
List<User> list = query.list();
for(User user:list){
System.out.println(user.toString());
}
session.close();
}
//1.2,简单绑定参数查询,不使用表名而使用类名,bean
//按参数名字绑定: 在 HQL 查询语句中定义命名参数, 命名参数以“:”开头
@Test
public void query2(){
Session session = sessionFactory.openSession();
Query query = session.createQuery("from User where name=:name and age=:age");
//第一个参数代表名字,第二个代表值
query.setString("name", "dada");
query.setInteger("age", 20);
List<User> list = query.list();
for(User user : list){
System.out.println(user.toString());
}
session.close();
}
//2,投影查询
@Test
public void query3(){
Session session = sessionFactory.openSession();
//注意这里投影查询哪些属性,那么bean类要有对应的构造方法
/*public User(String uid, String name) {
super();
this.uid = uid;
this.name = name;
}*/
Query query = session.createQuery("select new com.bean.User(uid,name) from User");
List<User> list = query.list();
for(User user : list){
System.out.println(user.toString());
}
session.close();
}
//3,分页查询
@Test
public void query4(){
Session session = sessionFactory.openSession();
Query query = session.createQuery("from User");
//设置分页查询的起始页面
query.setFirstResult(0);
//设置分页查询的显示页数
query.setMaxResults(3);
List<User> list = query.list();
for(User user : list){
System.out.println(user.toString());
}
session.close();
}
//4,QBC(Query By Criteria)
/*
QBC 查询就是通过使用 Hibernate 提供的 Query By Criteria API 来查询对象,这
种 API 封装了 SQL 语句的动态拼装,对查询提供了更加面向对象的功能接口。
QBC 提供的查询方式由:Criteria 接口,Criterion 接口和 Expression 类组成,支
持在运行时动态生成查询语句
*/
//4.1,Criteria简单查询
@Test
public void query5(){
//1,获取session对象
Session session = sessionFactory.openSession();
//2,通过session对象创建Criteria对象
Criteria crit = session.createCriteria(User.class);
//3,添加查询条件
crit.add(Restrictions.eq("name","xiaohong"));
crit.add(Restrictions.eq("age",0));
List<User> list = crit.list();
for(User user:list){
System.out.println(user.toString());
}
}
//4.2,Criteria - 存面向对象的数据库查询方式
//模糊查询
@Test
public void query6(){
Session session = sessionFactory.openSession();
Criteria crit = session.createCriteria(User.class);
//添加条件
crit.add(Restrictions.like("name", "%da%"));
List<User> list = crit.list();
for(User user : list){
System.out.println(user.toString());
}
session.close();
}
}
相关方法说明
短语 含义
Restrictions.eq 等于=
Restrictions.allEq 方法的参数为一个 Map 类型对象,包含多个名/值
对对应关系, 相当于多个 Expression.eq 的叠加
Restrictions.gt 大于>
Restrictions.ge 大于等于>=
Restrictions.lt 小于<
Restrictions.le 小于等于<=
Restrictions.between 对应 sql 的 between 子句
Restrictions.like 对应 sql 的 like 子句
Restrictions.in 对应 sql 的 in 子句
Restrictions.and and 关系
Restrictions.or or 关系
Restrictions.sqlRestriction Sql 限定查询