Java クエリ タイプ、HQL、基準、クエリの最適化、および顧客リストにクエリ条件を追加するための演習

怪我咯
リリース: 2018-05-18 15:38:56
オリジナル
1695 人が閲覧しました

1. クエリの種類

1.oid query-get

2. オブジェクト属性ナビゲーションクエリ

3.HQL

4.基準

5. ネイティブ SQL

2. クエリ 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();
            
        }
    
}
ログイン後にコピー
E

関連レベルの遅延ロードおよび取得戦略 (顧客の複数の連絡先の取得) 遅延ロードおよびフェッチ戦略 (連絡先を介した顧客の取得)

結論: 効率を向上させるには、lazy の値を true として選択する必要があります。

セッションなしの問題の解決: セッションの範囲を拡張します。

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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート