【hibernate】-hql単純属性+エンティティオブジェクトクエリー


最近ずっとhibernateを研究して、本当に深く入り込む楽しみが多ければ多いほど、hibernateの開発者に心から感心して、本当の体験はいつでも柔軟です!本当に大好き!本稿では、hibernateでのオリジナルsqlのクエリーの簡単なプロパティとエンティティオブジェクトの使用方法、およびいくつかの異なるパラメータクエリーについて説明します.
単純属性クエリー
1】単一属性
//         ,                ,  Student         
List students = session.createQuery("select name from Student").list();
for (Iterator iter=students.iterator(); iter.hasNext();){
	String name = (String)iter.next();
	System.out.println(name);
}

2)複数の属性
//      ,        
//                 
//      select          
List students = session.createQuery("select id, name from Student").list();
for (Iterator iter=students.iterator(); iter.hasNext();) {
	Object[] obj = (Object[])iter.next();
	System.out.println(obj[0] + ", " + obj[1]);
}

オリジナルsqlを使用する場合は別名を使用するか、asネーミング別名を使用する方法で処理できます.同様にhqlでサポートされています.
//       
List students = session.createQuery("select s.id, s.name from Student s").list();
//     as    
List students = session.createQuery("select s.id, s.name from Student as s").list();

3】パラメータ照会
1)個々の属性クエリー
a)つづり
//     
List students = session.createQuery("select id,name from Student where name like '%0%'").list();

b)プレースホルダ
List students = session.createQuery("select id,name from Student where name like ?")
		       .setParameter(0, "%0%").list();

c)コロンパラメータ名
List students = session.createQuery("select id,name from Student where name like :myname")
		       .setParameter("myname", "%0%").list();

2)複数の属性クエリー
a)プレースホルダ
  List students = session.createQuery( "select id,name from Student where id in(?,?,?,?,?)")
                    .setParameter(0, 1)
                    .setParameter(1, 2)
                    .setParameter(2, 3)
                    .setParameter(3, 4)
                    .setParameter(4, 5)
                    .list();

b)パラメータ名
 List students = session.createQuery("select id,name from Student where id in(:ids)")
                   .setParameterList("ids", new Object[]{1,2,3,4,5})
                   .list();

上記の2つの方法はどちらがいいですか?
パラメータの個数が変化すると、方法2は変更箇所が少なく、より柔軟で、簡便である必要があるため、2つ目をお勧めします.
エンティティ・オブジェクトのクエリー
1】 List
  List students = session.createQuery("from Student").list();
  for (Iterator iterator = students.iterator(); iterator.hasNext();)
 {
     Student student = (Student) iterator.next();
     System.out.println(student.getId() + ";" + student.getName());
 }         	

ヒント:hqlの実行を観察するときにselectは無視できますが、このクエリを実行するとsqlが1つしか発行されません.次のiterateと比較します.
2】iterate
 Iterator iter = session.createQuery("from Student").iterate();
 while (iter.hasNext())
      {
          Student student = (Student) iter.next();
          System.out.println(student.getName());
      }

ヒント:反復を使用してこのhqlを実行すると、コンソールにN+1本のsql文が表示され、システムの実行効率から言えば低下し、使用する価値はありませんが、メリットとデメリットを分析してから決定する必要があります.
3】Listとiterate使用仕様
上記iterateでN+1の問題が発生したとしたら、反復の使用を拒否しますか?実はそうではありません.次は2つのdemoを作ります.
1、listクエリの後にlistクエリを使用する
 @SuppressWarnings("unchecked")
    public void testQuery4()
    {
        Session session = null;
        try
        {
            session = HibernateUtils.getSession();
            session.beginTransaction();
            List students = session.createQuery("from Student").list();
            for (Iterator iterator = students.iterator(); iterator.hasNext();)
            {
                Student student = (Student) iterator.next();
                System.out.println(student.getId() + ";" + student.getName());

            }
            System.out.println("-----------------------------");
            /**
             *         
             * 
             *      ,    list              ,         
             *          student  , list  ,        
             * 
             *   list           ,          
             */
            students = session.createQuery("from Student").list();
            for (Iterator iterator = students.iterator(); iterator.hasNext();)
            {
                Student student = (Student) iterator.next();
                System.out.println(student.getId() + ";" + student.getName());

            }
            session.getTransaction().commit();
        }
        catch (Exception e)
        {
            e.printStackTrace();
            session.getTransaction().commit();
        }
        finally
        {
            HibernateUtils.closeSession(session);
        }
    }

2、listクエリーを使用してからiterateクエリーを使用する
@SuppressWarnings("unchecked")
    public void testQuery3()
    {
        Session session = null;
        try
        {
            session = HibernateUtils.getSession();
            session.beginTransaction();
            List students = session.createQuery("from Student").list();
            for (Iterator iterator = students.iterator(); iterator.hasNext();)
            {
                Student student = (Student) iterator.next();
                System.out.println(student.getId() + ";" + student.getName());

            }
            System.out.println("-----------------------------");
            /**
             *   N+1       list         session    ,    iterator   
             *          id     ,   id           。              ,
             *        id   sql  ,          
             * iterate  ,         ,       ,    N+1  
             */
            Iterator iter = session.createQuery("from Student").iterate();
            while (iter.hasNext())
            {
                Student student = (Student) iter.next();
                System.out.println(student.getName());

            }
            session.getTransaction().commit();
        }
        catch (Exception e)
        {
            e.printStackTrace();
            session.getTransaction().commit();
        }
        finally
        {
            HibernateUtils.closeSession(session);
        }
    }

両方は、メモリにデータがすでに存在する場合はiterateを使用して完全に満たす必要があります.メモリにない場合はlistを使用します.
【まとめ】
hqlについてはsqlのベースなので、接触しやすいです.hqlクエリーについてこの部分の内容は基本的にこんなに多くて、属性とエンティティを返すのは基本的に違いがありません.またlistとiterateの2つの使用状況については必ず区分しなければなりません.すべてはプログラムのためにもっと良い性能を持っています.