【hibernate】-hql単純属性+エンティティオブジェクトクエリー
6621 ワード
最近ずっとhibernateを研究して、本当に深く入り込む楽しみが多ければ多いほど、hibernateの開発者に心から感心して、本当の体験はいつでも柔軟です!本当に大好き!本稿では、hibernateでのオリジナルsqlのクエリーの簡単なプロパティとエンティティオブジェクトの使用方法、およびいくつかの異なるパラメータクエリーについて説明します.
単純属性クエリー
1】単一属性
2)複数の属性
オリジナルsqlを使用する場合は別名を使用するか、asネーミング別名を使用する方法で処理できます.同様にhqlでサポートされています.
3】パラメータ照会
1)個々の属性クエリー
a)つづり
b)プレースホルダ
c)コロンパラメータ名
2)複数の属性クエリー
a)プレースホルダ
b)パラメータ名
上記の2つの方法はどちらがいいですか?
パラメータの個数が変化すると、方法2は変更箇所が少なく、より柔軟で、簡便である必要があるため、2つ目をお勧めします.
エンティティ・オブジェクトのクエリー
1】 List
ヒント:hqlの実行を観察するときにselectは無視できますが、このクエリを実行するとsqlが1つしか発行されません.次のiterateと比較します.
2】iterate
ヒント:反復を使用してこのhqlを実行すると、コンソールにN+1本のsql文が表示され、システムの実行効率から言えば低下し、使用する価値はありませんが、メリットとデメリットを分析してから決定する必要があります.
3】Listとiterate使用仕様
上記iterateでN+1の問題が発生したとしたら、反復の使用を拒否しますか?実はそうではありません.次は2つのdemoを作ります.
1、listクエリの後にlistクエリを使用する
2、listクエリーを使用してからiterateクエリーを使用する
両方は、メモリにデータがすでに存在する場合はiterateを使用して完全に満たす必要があります.メモリにない場合はlistを使用します.
【まとめ】
hqlについてはsqlのベースなので、接触しやすいです.hqlクエリーについてこの部分の内容は基本的にこんなに多くて、属性とエンティティを返すのは基本的に違いがありません.またlistとiterateの2つの使用状況については必ず区分しなければなりません.すべてはプログラムのためにもっと良い性能を持っています.
単純属性クエリー
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つの使用状況については必ず区分しなければなりません.すべてはプログラムのためにもっと良い性能を持っています.