- PR -

hibernate での "select max(COL) from TABLENAME" の使い方

1
投稿者投稿内容
わか
常連さん
会議室デビュー日: 2003/12/14
投稿数: 47
お住まい・勤務地: 広島市
投稿日時: 2005-01-20 10:36
いつもお世話になっております。

現在、hibernate 2.1.7c を使っています。

hql を利用し、
【select * from TABLENAME where COL = '123'】の結果を

//==ソースコード==
Session session = sessionFactory.openSession();
hql = "from TABLENAME where COL = '123'";
List list = session.find(hql);
session.close;
//==ソースコード==

のように実行することは理解できたのですが
【select max(COL) from TABLENAME】の取得方法が分かりません。
具体的には、下記のsession.find の部分をどのように変更するべきなのでしょうか?

//==ソースコード==
Session session = sessionFactory.openSession();
hql = "select max(tb01.COL) from TABLENAME tb01";
List list = session.find(hql); ←この部分
session.close;
//==ソースコード==

過去ログなどや、インターネット上の他のリソースも検索したのですが、
見つけることができませんでした。

具体的なソースコードで指摘頂けませんでしょうか。
どうぞ、宜しくお願いいたします。

H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2005-01-20 11:29
こんな感じでできるはず。

コード:
Session session = sessionFactory.openSession();
( (Integer) session.iterate("select max(tb01.COL) from TABLENAME tb01").next() ).intValue();
session.close; 



マニュアルのTip集に載っています。Queryオブジェクトを使う方法もあります。

なおもう持っているかもしれませんが、ここにマニュアルがあります。
http://www.hibernate.org/hib_docs/reference/ja/html/index.html
特に「1. Tomcatでクイック・スタート (1.4. ネコと遊ぶ)」とか 「11. HQL: Hibernateクエリ言語」が便利です。
わか
常連さん
会議室デビュー日: 2003/12/14
投稿数: 47
お住まい・勤務地: 広島市
投稿日時: 2005-01-21 21:37
アドバイスありがとうございます。
max(COL)については、解決いたしました。

お教え頂いたマニュアル、書籍の「オープンソースJavaプロダクツ」を
参考としていますが、hibernate についてまだまだ理解不足な点が多々あり、
度々で申し訳ないのですが、もうひとつアドバイスを頂けませんでしょうか。

//==CSVファイルから2万件程のデータをDBにinsertあるいはupdateするケース

//list1 <-- CSVデータ2万レコードを格納したArrayList

for(i=0; i<list1.size(); i++){

CsvBean cb = new CsvBean();

ArrayList list2 = (ArrayList) list1.get(i); // ArrayListからcsv1レコードを取得

cb.setCOL1(list2.get(0).toString()); // hibernateで使うbeanにセット
(〜省略〜)
cb.setCOL20(list2.get(0).toString());

xxxDAOFactory().create().ins(cb); // daoによりDBへinsert
}

■疑問1■
上記ループ処理の途中で処理がエラーとなった場合に、rollbackを行う方法。
※dao中で毎回(2万回)トランザクションが完結しているため、どのようにするか?
2万レコードの1レコード目を処理する前にトランザクションを開始し、
2万レコードをすべて処理し終わった場合にはcommit、途中でエラー(不適当なデータ)を
見つけた場合にはrollbackするやり方。

■疑問2■
CSV2万レコードをinsertあるいはupdateする場合、
ループ処理で毎回(2万回)CsvBeanのインスタンスを作成し、
毎回daoでデータをinsertあるいはupdateするのが一般的な方法なのか?

以上についてアドバイス頂けませんでしょうか。
宜しくお願いいたします。
1

スキルアップ/キャリアアップ(JOB@IT)