Hibernate查询方式:
- 对象导航查询:根据已经加载的对象,导航到他的关联对象。它利用类与类之间的关系来检索对象。
- OID查询:根据id查询某一条记录,返回对象。
- HQL查询:(Hibernate Query Language),Hibernate提供的一种查询语言,它和sql查询语言有些相似,但它使用的是类、对象和属性的概念,而没有表和字段的概念。
- QBC查询:(Query By Criteria)利用Criteria对象
- 本地sql查询:利用SQLQuery对象,使用普通的sql语句实现查询。
对象导航查询和OID查询示例:
public class HibernateDemo08 {
public static void main(String[] args) {
Session session = null;
Transaction tx = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();
//对象导航查询
NativePlace nativePlace = session.get(NativePlace.class, 1);
//该集合中存储着所有"陕西省"(t_user表中外键为1)的用户
Set<User> userSet = nativePlace.getUserSet();
for(User user : userSet) {
System.out.println(user);
}
//OID查询 根据session对象的get和load()方法
User user = session.get(User.class, 3);
System.out.println(user);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally {
session.close();
}
}
}
HQL查询:
使用hql查询需要写hql语句。它与sql语句不同,sql语句操作的是表,而它操作的是类。几种常用的查询总结:
- 查询所有:from 实体类名称
- 条件查询:from 实体类名称 where 属性名称=?
- 排序查询:from 实体类名称 oder by 实体类属性名称 asc/desc
- 分页查询:MySQL中实现分页查询需要使用关键字limit。而在hql操作中,在语句里面不能写limit。Hibernate的Query对象封装了两个方法实现分页操作
public class HibernateDemo09 {
public static void main(String[] args) {
Session session = null;
Transaction tx = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();
//查询所有
Query query1 = session.createQuery("from User");
List<User> users = query1.list();
for(User user : users) {
System.out.println(user);
}
//条件查询,查询用户名中包含"杨"的,并按id降序排列
Query query2 = session.createQuery("from User u where u.userName like ? order by id desc");
query2.setParameter(0, "%杨%"); //这里的索引是从0开始
users = query2.list();
for(User user : users) {
System.out.println(user);
}
//分页查询
Query query3 = session.createQuery("from User");
//设置本页的开始位置
query3.setFirstResult(0);
//设置本页要显示的记录数
query3.setMaxResults(2);
users = query3.list();
for(User user : users) {
System.out.println(user);
}
//聚合函数的使用
Query query4 = session.createQuery("select count(*) from User");
Long count = (Long) query4.uniqueResult();
System.out.println(count);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally {
session.close();
}
}
}