标签:记录 hql parameter 案例 list 映射 索引 连接 显示
OID查询
根据对象的OID主键检索。
session.get(Customer.class,1L)
session.load(Customer.class,1L)
对象导航检索
根据一个已经查询到的对象,获得关联的对象的一种查询
A a = session.get(A,1L)
B b = a.getB()
HQL检索
通过session.createQuery()接受一个HQL查询方式
简单查询
Query query = session.createQuery("from Customer")
List<Customer> list = query.list()
排序查询
Query query = session.createQuery("from Customer orderby 属性名")
Query query = session.createQuery("from Customer orderby 属性名 desc")
条件查询
1. 按位置绑定
Query query = session.createQuery("from Custoer where name=?0");
query.setParameter(0,"jack")
Query query = session.createQuery("from Custoer where name=?0 and age=?1");
query.setParameter(0,"wells")
query.setParameter(0,32)
2. 按名称绑定
Query query = session.createQuery("from Custoer where name=:aaa and company like:bbb);
query.setParameter("aaa":"jack")
query.setParameter("bbbb":"杭州%")
投影查询
Query query = session.createQuery("select c.name from Customer c where name=:aaa and company like:bbb);
查询多个属性封装到对下个闹钟功能
1.类中要新建一个构造方法,参数自定
2.session.createQuery("select new Customer(自定义属性1,自定义属性2)")
分页查询
Query query = session.createQuery("from Custoer where name=?0");
query.setFirstResult(0);
query.setMaxResults(10);
分组统计查询
聚合函数
Query query = session.createQuery("select count(*) from Customer");
分组统计
Query query = session.createQuery("select count(*) from Customer" group by name);
多表查询
交叉连接
select * from A,B
内连接 : inner join (inner 可以省略)
隐式内连接
select * A,B where A.id = B.aid
显示内连接
select * from A join B on A.id=B.aid
HQL: session.createQuery("from Customer c inner join c.link") 直接inner join 关联的字段
迫切内连接:inner join fetch,把连接对象的数据装到Customer的集合里
外连接
左外连接
select * from A left outer join B on A.id = B.aid
左边表的可以全部查询和右边表的公共部分
右外连接
right outer join
右边表的全部和左边表的公共部分
QBC检索
简单查询
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
CriteriaQuery<Customer> query = criteriaBuilder.createQuery(Customer.class);
query.from(Customer.class);
List<Customer> resultList = session.createQuery(query).getResultList();
for (Customer customer : resultList) {
System.out.println(customer);
}
tx.commit();
排序查询
Root<Customer> root = query.from(Customer.class);
query.orderBy(criteriaBuilder.asc(root.get("id")));
分页查询
@Test
public void test05() {
//1. 获取CriteriaQuery对象
CriteriaQuery<Emp> criteria = criteriaBuilder.createQuery(Emp.class);
//2. 指定根条件
Root<Emp> empRoot = criteria.from(Emp.class);
//3. 设置orderBy的字段
criteria.orderBy(criteriaBuilder.desc(empRoot.get("sal")));
//4. 设置分页的基本属性
int pageSize = 3;
int pageNow = 2;
int pageIndex = (pageNow - 1) * pageSize;
//5. 执行查询,这里需要指定查询的起始索引和查询的记录数量
List<Emp> list = session.createQuery(criteria).setFirstResult(pageIndex).setMaxResults(pageSize).list();
//6. 打印查询结果
for (Emp emp : list) {
System.out.println(emp.getEmp_id() + " " + emp.getSal());
}
}
条件查询
@Test
// 查询部门号为2,且薪水大于2000.00的所有雇员,或者job是CLERK的雇员
public void test03(){
CriteriaQuery<Emp> criteria = criteriaBuilder.createQuery(Emp.class);
Root<Emp> root = criteria.from(Emp.class);
//创建两个条件
Predicate dept = criteriaBuilder.equal(root.get("dept"), new Dept(2, null, null));
Predicate sal = criteriaBuilder.gt(root.get("sal"), 2000.00);
Predicate job = criteriaBuilder.equal(root.get("job"), "CLERK");
//到这里上面部分都与上一个案例类似
//注意在将多个条件且或嵌套时,可以使用or/and方法嵌套的方式进行
criteria.where(criteriaBuilder.or(criteriaBuilder.and(dept, sal), job));
List<Emp> list = session.createQuery(criteria).getResultList();
for (Emp emp : list) {
System.out.println("name = " + emp.getEname() + "\t\tsal = " + emp.getSal() +
"\t\tdept_id = " + emp.getDept().getDept_id() +
"\t\tjob = " + emp.getJob());
}
}
SQL检索
SQLQuery sqlQuery = session.createSQLQuery("select * from 数据库表名")
sqlQuery.addEntity(A.class) // 会将查询到的关联数据封装到A类中
离线条件查询(需要google最新的)
DetachedCriteria dc = DetachedCriterai.forClass(Customer.class)
dc.add(Restrictions.eq()) // 设置条件
service.query(dc)
懒加载
类级别的延迟加载
session.load(Customer.class,1L)
1. 可以靠持久化类映射文件中class标签 lazy属性控制,lazy=false关闭懒加载
2. 可以把持久化类用final修饰
关联级别的延迟加载
Customer customer = session.get(Customer.class,1L)
customer.getLinkmans() 通过客户获得联系人的时候,联系人对象是否采用了延迟加载,可以在关联的set标签上配置lazy,成为关联级别的延迟
标签:记录 hql parameter 案例 list 映射 索引 连接 显示
原文地址:https://www.cnblogs.com/jimmyhe/p/12554371.html