table of Contents
One: Hibernate retrieval method
1. HQL retrieval method
Use object-oriented HQL query language for query
Example:
public class Test {
public static void main(String[] args) {
//findOrder();
//findOrder2();
//findOrder3();
//findUserByPage(2, 3);
findAllUsers();
HibernateUtil.closeFactory();
}
/**
* 查询订单数量大于0的所有用户
*/
public static void findOrder() {
Session session=HibernateUtil.openSession();
String hql="from User u where 0<(select count(o) from u.orders o)";
Query query=session.createQuery(hql);
List<User> users=query.list();
for(User user:users) {
System.out.println(user);
}
session.close();
}
/**
* 查询有订单的用户(使用in关键字)
*/
public static void findOrder2() {
Session session=HibernateUtil.openSession();
String hql="from User u where u in(select o.user from Order o group by o.user)";
Query query=session.createQuery(hql);
List<User> users=query.list();
for(User user:users) {
System.out.println(user);
}
session.close();
}
/**
* 查询有订单的用户(使用函数)
*/
public static void findOrder3() {
Session session=HibernateUtil.openSession();
String hql="from User u where size(u.orders)>0";
Query query=session.createQuery(hql);
List<User> users=query.list();
for(User user:users) {
System.out.println(user);
}
session.close();
}
/**
* hql进行分页查询
*/
public static void findUserByPage(int pageNum,int pageSize) {
Session session=HibernateUtil.openSession();
String hql="from User";
Query query=session.createQuery(hql);
query.setFirstResult((pageNum-1)*pageSize);//每页的第一个数据
query.setMaxResults(pageSize);//每页的数量
List<User> users=query.list();
System.out.println(users);
session.close();
}
/**
* hql的引用查询
*/
public static void findAllUsers() {
Session session=HibernateUtil.openSession();
Query query=session.createNamedQuery("findAllUsers", User.class);
List list=query.list();
System.out.println(list);
session.close();
}
}
2. QBC (Query By Criteria) query
- QBC can be regarded as an objectified representation of traditional SQL
- It is mainly composed of Criteria interface, Criterion interface, and Restrictions class.
- It can be seen as an example of encapsulating HQL again
:
public class Test1 {
public static void main(String[] args) {
searchByQBC();
}
//使用QBC进行检索
public static void searchByQBC() {
Session session=HibernateUtil.openSession();
Criteria criteria=session.createCriteria(User.class);
Criterion c1=Restrictions.eq("userName","张三");
criteria.add(c1);
List<User> users=criteria.list();
System.out.println(users);
}
}
Parameters in Restrictions:
3. Local SQL query
According to the query of the database itself, you can use the database's own dialect
test:
public class Test3 {
public static void main(String[] args) {
searchUser();
}
public static void searchUser() {
Session session=HibernateUtil.openSession();
String sql="select * from user";
NativeQuery query=session.createNativeQuery(sql,User.class);
List<User> users=query.list();
for(User user:users) {
System.out.println(user);
}
session.close();
}
}
Two: Hibernate's search strategy
Immediate search: Load the object specified by the search method immediately.
-Loading unnecessary objects is wasting memory space.
-The large number of select statements and frequent access to the database affect system performance.
Delayed retrieval: Delayed loading the object specified by the retrieval method.
-Avoid multiple loading of data objects that the application does not need to access.
Urgent left outer join search: Use the SQL outer join query function to load the specified object of the search method.
-Reduce the number of execute select statements, reduce database access, and improve system performance.
- Class-level retrieval strategy: the retrieval strategy of the retrieval object (User) specified by the Hibernate retrieval method;
- Relevance level retrieval strategy: the retrieval strategy of the object (Order) related to the retrieval object specified by the retrieval method.
application:
public class Test2 {
public static void main(String[] args) {
//search();
search1();
}
/**
* Hibernate类级别的立即检索和延迟检索
*/
public static void search() {
Session session=HibernateUtil.openSession();
//User user=session.get(User.class, new Integer(1));//类级别的立即检索,会执行SQL语句
User user=session.load(User.class,new Integer(4));//类级别的延迟检索,当使用这个对象时才会执行sql语句,只是会创建Oid属性
Hibernate.initialize(user);//这个方法也会初始化对象
//System.out.println(user.getPassWord());
System.out.println(user);
session.close();
}
/*
* 默认情况下多对一和一对一的检索方式
*/
public static void search1() {
Session session=HibernateUtil.openSession();
Order order=session.get (Order.class,new Integer(1));
System.out.println(order);
session.close();
}
}
Optional search strategy at class level and association level:
Configuration method: add lazy attribute to class, true means delayed search
lazy="true"
Relevance level search strategy one-to-many and many-to-many:
Relevance level search strategy many-to-one: