1. 쿼리 유형
1.oid query-get
2. 객체 속성 탐색 쿼리
3.HQL
4.기준
5. 네이티브 SQL
2. Query-HQL 구문
//学习HQL语法public class Demo { //基本语法 @Testpublic void fun1(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction();//----------------------------------------------------String hql = " from cn.itcast.domain.Customer ";//完整写法String hql2 = " from Customer "; //简单写法String hql3 = " from java.lang.Object "; Query query = session.createQuery(hql3); List list = query.list(); System.out.println(list);//---------------------------------------------------- tx.commit(); session.close(); } @Test//排序public void fun2(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction();//----------------------------------------------------String hql1 = " from cn.itcast.domain.Customer order by cust_id asc ";//完整写法String hql2 = " from cn.itcast.domain.Customer order by cust_id desc ";//完整写法 Query query = session.createQuery(hql2); List list = query.list(); System.out.println(list);//---------------------------------------------------- tx.commit(); session.close(); } @Test//条件查询public void fun3(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction();//----------------------------------------------------String hql1 = " from cn.itcast.domain.Customer where cust_id =? ";//完整写法String hql2 = " from cn.itcast.domain.Customer where cust_id = :id ";//完整写法 Query query = session.createQuery(hql2); // query.setParameter(0, 2l);query.setParameter("id", 2l); List list = query.list(); System.out.println(list);//---------------------------------------------------- tx.commit(); session.close(); } @Test//分页查询public void fun4(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction();//----------------------------------------------------String hql1 = " from cn.itcast.domain.Customer ";//完整写法 Query query = session.createQuery(hql1); //limit ?,?// (当前页数-1)*每页条数query.setFirstResult(2); query.setMaxResults(2); List list = query.list(); System.out.println(list);//---------------------------------------------------- tx.commit(); session.close(); } @Test//统计查询//count 计数//sum 求和//avg 平均数//max//minpublic void fun5(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction();//----------------------------------------------------String hql1 = " select count(*) from cn.itcast.domain.Customer ";//完整写法String hql2 = " select sum(cust_id) from cn.itcast.domain.Customer ";//完整写法String hql3 = " select avg(cust_id) from cn.itcast.domain.Customer ";//完整写法String hql4 = " select max(cust_id) from cn.itcast.domain.Customer ";//完整写法String hql5 = " select min(cust_id) from cn.itcast.domain.Customer ";//完整写法 Query query = session.createQuery(hql5); Number number = (Number) query.uniqueResult(); System.out.println(number);//---------------------------------------------------- tx.commit(); session.close(); } @Test//投影查询public void fun6(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction();//----------------------------------------------------String hql1 = " select cust_name from cn.itcast.domain.Customer "; String hql2 = " select cust_name,cust_id from cn.itcast.domain.Customer "; String hql3 = " select new Customer(cust_id,cust_name) from cn.itcast.domain.Customer "; Query query = session.createQuery(hql3); List list = query.list(); System.out.println(list); //---------------------------------------------------- tx.commit(); session.close(); } }
HQL 구문 알아보기
public class Demo2 {//回顾-原生SQL// 交叉连接-笛卡尔积(避免)// select * from A,B // 内连接// |-隐式内连接// select * from A,B where b.aid = a.id// |-显式内连接// select * from A inner join B on b.aid = a.id// 外连接// |- 左外// select * from A left [outer] join B on b.aid = a.id// |- 右外// select * from A right [outer] join B on b.aid = a.id//---------------------------------------------------------------------//HQL的多表查询//内连接(迫切)//外连接// |-左外(迫切)// |-右外(迫切) @Test//HQL 内连接 => 将连接的两端对象分别返回.放到数组中.public void fun1(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction();//----------------------------------------------------String hql = " from Customer c inner join c.linkMens "; Query query = session.createQuery(hql); List<Object[]> list = query.list(); for(Object[] arr : list){ System.out.println(Arrays.toString(arr)); }//---------------------------------------------------- tx.commit(); session.close(); } @Test//HQL 迫切内连接 => 帮我们进行封装.返回值就是一个对象public void fun2(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction();//----------------------------------------------------String hql = " from Customer c inner join fetch c.linkMens "; Query query = session.createQuery(hql); List<Customer> list = query.list(); System.out.println(list);//---------------------------------------------------- tx.commit(); session.close(); } @Test//HQL 左外连接 => 将连接的两端对象分别返回.放到数组中.public void fun3(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction();//----------------------------------------------------String hql = " from Customer c left join c.linkMens "; Query query = session.createQuery(hql); List<Object[]> list = query.list(); for(Object[] arr : list){ System.out.println(Arrays.toString(arr)); }//---------------------------------------------------- tx.commit(); session.close(); } @Test//HQL 右外连接 => 将连接的两端对象分别返回.放到数组中.public void fun4(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction();//----------------------------------------------------String hql = " from Customer c right join c.linkMens "; Query query = session.createQuery(hql); List<Object[]> list = query.list(); for(Object[] arr : list){ System.out.println(Arrays.toString(arr)); }//---------------------------------------------------- tx.commit(); session.close(); } }
HQL 구문 알아보기 (일반적으로 사용되지 않음) - 다중 테이블 쿼리 구문
3. 쿼리 - 기준 구문
public class Demo { @Test//基本语法public void fun1(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction();//---------------------------------------------------- Criteria c = session.createCriteria(Customer.class); List<Customer> list = c.list(); System.out.println(list); //---------------------------------------------------- tx.commit(); session.close(); } @Test//条件语法public void fun2(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction();//---------------------------------------------------- Criteria c = session.createCriteria(Customer.class); // c.add(Restrictions.idEq(2l));c.add(Restrictions.eq("cust_id",2l)); List<Customer> list = c.list(); System.out.println(list); //---------------------------------------------------- tx.commit(); session.close(); } @Test//分页语法 - 与HQL一样public void fun3(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction();//---------------------------------------------------- Criteria c = session.createCriteria(Customer.class);//limit ?,? c.setFirstResult(0); c.setMaxResults(2); List<Customer> list = c.list(); System.out.println(list); //---------------------------------------------------- tx.commit(); session.close(); } @Test//排序语法 public void fun4(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction();//---------------------------------------------------- Criteria c = session.createCriteria(Customer.class); c.addOrder(Order.asc("cust_id"));//c.addOrder(Order.desc("cust_id")); List<Customer> list = c.list(); System.out.println(list); //---------------------------------------------------- tx.commit(); session.close(); } @Test//统计语法 public void fun5(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction();//---------------------------------------------------- Criteria c = session.createCriteria(Customer.class); //设置查询目标 c.setProjection(Projections.rowCount()); List list = c.list(); System.out.println(list); //---------------------------------------------------- tx.commit(); session.close(); } }
기준 구문 알아보기
오프라인
public class Demo2 { @Testpublic void fun1(){//Service/web层DetachedCriteria dc = DetachedCriteria.forClass(Customer.class); dc.add(Restrictions.idEq(6l));//拼装条件(全部与普通Criteria一致) //----------------------------------------------------Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction();//----------------------------------------------------Criteria c = dc.getExecutableCriteria(session); List list = c.list(); System.out.println(list);//---------------------------------------------------- tx.commit(); session.close(); } }
오프라인 기준 학습
IV. 쿼리 최적화
클래스 수준 쿼리 가져오기 방법: 호출되면 데이터를 즉시 쿼리합니다.
로드 방법: 애플리케이션 클래스 레벨 로딩 전략 r
public class Demo { @Test// get方法 : 立即加载.执行方法时立即发送sql语句查询结果public void fun1(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction();//---------------------------------------------------- Customer c = session.get(Customer.class, 2l); System.out.println(c);//---------------------------------------------------- tx.commit(); session.close(); } @Test// load方法(默认):是在执行时,不发送任何sql语句.返回一个对象.使用该对象时,才执行查询.// 延迟加载: 仅仅获得没有使用.不会查询.在使用时才进行查询.// 是否对类进行延迟加载: 可以通过在class元素上配置lazy属性来控制.//lazy:true 加载时,不查询.使用时才查询b//lazy:false 加载时立即查询.public void fun2(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction();//---------------------------------------------------- Customer c = session.load(Customer.class, 2l); //---------------------------------------------------- tx.commit(); session.close(); System.out.println(c); } }
public class Demo { //集合级别的关联//fetch:select 单表查询//lazy:true 使用时才加载集合数据. @Testpublic void fun1(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction();//---------------------------------------------------- Customer c = session.get(Customer.class, 2l); Set<LinkMan> linkMens = c.getLinkMens();//关联级别 System.out.println(linkMens); //---------------------------------------------------- tx.commit(); session.close(); } //集合级别的关联//fetch:select 单表查询//lazy:false 立即记载集合数据 @Testpublic void fun2(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction();//---------------------------------------------------- Customer c = session.get(Customer.class, 2l); Set<LinkMan> linkMens = c.getLinkMens();//关联级别 System.out.println(linkMens); //---------------------------------------------------- tx.commit(); session.close(); }//集合级别的关联//fetch:select 单表查询//lazy:extra 极其懒惰.与懒加载效果基本一致. 如果只获得集合的size.只查询集合的size(count语句) @Testpublic void fun3(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction();//---------------------------------------------------- Customer c = session.get(Customer.class, 2l); Set<LinkMan> linkMens = c.getLinkMens();//关联级别 System.out.println(linkMens.size()); System.out.println(linkMens); //---------------------------------------------------- tx.commit(); session.close(); }//集合级别的关联//fetch:join 多表查询//lazy:true|false|extra 失效.立即加载. @Testpublic void fun4(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction();//---------------------------------------------------- Customer c = session.get(Customer.class, 2l); Set<LinkMan> linkMens = c.getLinkMens();//关联级别 System.out.println(linkMens.size()); System.out.println(linkMens); //---------------------------------------------------- tx.commit(); session.close(); } @Test//fetch: subselect 子查询//lazy: true 懒加载public void fun5(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction();//---------------------------------------------------- String hql = "from Customer"; Query query = session.createQuery(hql); List<Customer> list = query.list(); for(Customer c:list){ System.out.println(c); System.out.println(c.getLinkMens().size()); System.out.println(c.getLinkMens()); } //---------------------------------------------------- tx.commit(); session.close(); } @Test//fetch: subselect 子查询//lazy: false 立即加载public void fun6(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction();//---------------------------------------------------- String hql = "from Customer"; Query query = session.createQuery(hql); List<Customer> list = query.list(); for(Customer c:list){ System.out.println(c); System.out.println(c.getLinkMens().size()); System.out.println(c.getLinkMens()); } //---------------------------------------------------- tx.commit(); session.close(); } @Test//fetch: subselect 子查询//lazy: extra 极其懒惰public void fun7(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction();//---------------------------------------------------- String hql = "from Customer"; Query query = session.createQuery(hql); List<Customer> list = query.list(); for(Customer c:list){ System.out.println(c); System.out.println(c.getLinkMens().size()); System.out.println(c.getLinkMens()); } //---------------------------------------------------- tx.commit(); session.close(); } }
관련 레벨 지연 로딩 및 잡기 전략(고객 확보 다중 연락처) 지연 로딩 및 가져오기 전략(연락처를 통해 고객 확보)
결론: 효율성을 높이려면 가져오기를 선택해야 합니다. 게으른 값을 모두 기본값으로 선택해야 합니다. 세션 없음 문제 해결: 세션 범위를 확장합니다.
public class Demo2 { @Test//fetch:select 单表查询//lazy:proxy //customer-true 懒加载public void fun1(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction();//---------------------------------------------------- LinkMan lm = session.get(LinkMan.class, 3l); Customer customer = lm.getCustomer(); System.out.println(customer); //---------------------------------------------------- tx.commit(); session.close(); } @Test//fetch:join 多表//lazy: 失效 public void fun3(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction();//---------------------------------------------------- LinkMan lm = session.get(LinkMan.class, 3l); Customer customer = lm.getCustomer(); System.out.println(customer); //---------------------------------------------------- tx.commit(); session.close(); } @Test//fetch:select 单表查询//lazy:proxy //customer-false 立即加载public void fun2(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction();//---------------------------------------------------- LinkMan lm = session.get(LinkMan.class, 3l); Customer customer = lm.getCustomer(); System.out.println(customer); //---------------------------------------------------- tx.commit(); session.close(); } }
5. 연습: 고객 목록에 쿼리 조건 추가
지난번에 기본적으로 언급한 코드는 고객 목록을 표시하기 전에 필터링을 추가합니다. 조건:
public class Demo {
@Testpublic void fun1(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();//----------------------------------------------------
String hql = "from Customer ";
Query query = session.createQuery(hql);
List<Customer> list = query.list(); for(Customer c:list){
System.out.println(c.getLinkMens());
} //---------------------------------------------------- tx.commit();
session.close();
}
}
서블릿 레이어 코드
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1获得查询条件String cust_name = request.getParameter("cust_name");//2判断查询条件是否不为空DetachedCriteria dc = DetachedCriteria.forClass(Customer.class); if(cust_name!=null && !"".equals(cust_name)){ dc.add(Restrictions.like("cust_name", "%"+cust_name+"%")); }//不为空=>添加条件//3 调用Service查询所有客户List<Customer> list = cs.getAll(dc);//4 将客户列表放入request域request.setAttribute("list", list);//5 转发到list.jsp显示request.getRequestDispatcher("/jsp/customer/list.jsp").forward(request, response); }
public List<Customer> getAll(DetachedCriteria dc) { Session session = HibernateUtils.getCurrentSession();//打开事务Transaction tx = session.beginTransaction(); List<Customer> list = customerDao.getAll(dc); //关闭事务 tx.commit();return list; }
Dao 레이어 코드
위 내용은 고객 목록에 쿼리 조건을 추가하기 위한 Java 쿼리 유형, HQL, 기준, 쿼리 최적화 및 연습의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!