#freeze
* [[Hibernate]]
#contents
** 環境
http://www.hibernate.org/からHibernate CoreとHibernate Toolsをダウンロードしました。
Hibernate Tools(Update site:http://download.jboss.org/jbosside/updates/development )はEclipseに組み込んでDBよりJavaBeans,マッピングファイル,設定ファイルを自動生成してくれます。
この中のHibernate ConsoleはHQLを試すには便利です。Eclipse3.2でも動きました。
[[Eclipse パーフェクトマニュアル Vol.6>http://www.amazon.co.jp/exec/obidos/ASIN/4774128457/worried-22]]に詳細があります。
またMiddlegen(http://boss.bekk.no/boss/middlegen/ )もあり、EclipsePluginとして、MiddlegenIDE 1.3.3(http://sourceforge.net/project/showfiles.php?group_id=36044 )があり、自動生成してくれます。
参考http://www.atmarkit.co.jp/fjava/rensai3/eclipseplgn03/eclipseplgn03_3.html
** サンプル
* Table001
* <many-to-one
* name="table003"
* class="org.ultimania.model.Table003"
* update="false" insert="false">
* <column name="nokokyaku" />
* <column name="nokanri" />
* </many-to-one>
public static void main(String[] args) {
Configuration config = new Configuration();
config = config.configure();
SessionFactory sessionfactory = config.buildSessionFactory();
Session session = sessionfactory.openSession();
Transaction tx = session.beginTransaction();
try {
// 1テーブル全件ロード
Criteria crit = session.createCriteria(Table003.class);
List list = crit.list();
for (int i = 0; i < list.size(); i++) {
Table003 table003 = (Table003) list.get(i);
System.out.println("A:" + table003.getComp_id().getDbhinban() + ":" + table003.getNmsyohin());
}
// 1テーブルプライマリーキーで検索 load使用
Table003PK table003PK = new Table003PK();
table003PK.setNokokyaku("A");
table003PK.setDbhinban("BBB");
Table003 table003 = (Table003) session.load(Table003.class, table003PK);
System.out.println("B:" + table003.getComp_id().getDbhinban() + ":" + table003.getNmsyohin());
//criteriaを複数
Criteria crit2;
crit = session.createCriteria(Table001.class);
crit2 = crit.createCriteria("table003");
crit.add(Expression.like("nokanri", "OHR%"));
crit2.add(Expression.like("comp_id.dbhinban", "%BK"));
//where this_.dbhinban like ?
list = crit.list();
for (int i = 0; i < list.size(); i++) {
Table001 table001 = (Table001) list.get(i);
System.out.println("B1:" + table001.getNmsyohin() );
}
// HSQLで検索 プライマリキーの場合は、middlegenで生成したプライマリキークラスを使用
Query q = session.createQuery("from Table003 x3 where x3.comp_id.nokokyaku = :nokokyaku");
q.setString("nokokyaku", "TOP");
List result = q.list();
for (int i = 0; i < result.size(); i++) {
Table003 table0031 = (Table003) result.get(i);
System.out.println("C:" + table0031.getComp_id().getDbhinban() + ":" + table0031.getNmsyohin());
}
// HSQLで検索 件数をしている 11件目(0から始まる)から20件 同等にCriteriaでも件数指定可
q = session.createQuery("from Table003 x3 where x3.comp_id.nokokyaku = :nokokyaku");
q.setString("nokokyaku", "TOP");
q.setFirstResult(10);
q.setMaxResults(20);
result = q.list();
for (int i = 0; i < result.size(); i++) {
Table003 table0031 = (Table003) result.get(i);
System.out.println("D:" + table0031.getComp_id().getDbhinban() + ":" + table0031.getNmsyohin());
}
// 集合関数
q = session.createQuery("select sum(kgjyodai),avg(kgjyodai) from Table003 x3");
Object[] data = (Object[])q.uniqueResult();
System.out.println("E:" + ((Integer)data[0]).toString());
/*
複数の場合
result = q.list();
for (int i = 0; i < result.size(); i++) {
Object[] data = (Object[])result.get(i);
Integer a = (Integer)data[0];
System.out.println("E:" + ((Integer)((Object[])result.get(i))[0]).toString());
}
*/
// HSQLで検索 1件と分かっている場合 uniqueResultをつかっている。
q = session.createQuery("from Table003 x3 where x3.comp_id.nokokyaku = :nokokyaku and x3.comp_id.dbhinban = :dbhinban");
q.setString("nokokyaku", "A");
q.setString("dbhinban", "BBB");
table003 = (Table003) q.uniqueResult();
System.out.println("F:" + table003.getComp_id().getDbhinban() + ":" + table003.getNmsyohin());
// 結合(シータスタイル)
String strSQL = " select xx001.*,xx003.* from table_xx003 xx003,table_xx001 xx001 where xx003.dbhinban = xx001.nokanri";
strSQL = strSQL + " and xx003.dbhinban like '11%'";
strSQL = strSQL + " order by xx003.dbhinban";
SQLQuery sqlQuery = session.createSQLQuery(strSQL);
sqlQuery.addEntity("xx003", Table003.class);
sqlQuery.addEntity("xx001", Table001.class);
list = sqlQuery.list();
for (int i = 0; i < list.size(); i++) {
Object[] items = (Object[]) list.get(i);
Table003 table003a = (Table003) items[0];
Table001 table001a;
if (items[1] == null) {
table001a = new Table001();
} else {
table001a = (Table001) items[1];
}
System.out.println("G:" + table003a.getComp_id().getDbhinban() + ":" + table001a.getNolot());
}
// 外部結合
strSQL = " select xx003.*,xx001.* from table_003 xx003 left join table_001 xx001 on xx003.dbhinban = xx001.nokanri";
strSQL = strSQL + " where xx003.dbhinban like '11%'";
strSQL = strSQL + " order by xx003.dbhinban";
sqlQuery = session.createSQLQuery(strSQL);
sqlQuery.addEntity("xx003", Table003.class);
sqlQuery.addEntity("xx001", Table001.class);
sqlQuery.setFirstResult(0);
sqlQuery.setMaxResults(3);
list = sqlQuery.list();
for (int i = 0; i < list.size(); i++) {
Object[] items = (Object[]) list.get(i);
Table003 table003a = (Table003) items[0];
Table001 table001a;
if (items[1] == null) {
table001a = new Table001();
} else {
table001a = (Table001) items[1];
}
System.out.println("H:" + table003a.getComp_id().getDbhinban() + ":" + table001a.getNolot());
}
// 1件更新
table003.setCdcolor("ほほ");
//session.save(table003);
// clearを使った場合、分離されsave時にinsertとなってしまうので、updateにしている。
session.clear();
session.update(table003);
//一括更新
Query query = session.createQuery("update Table003 set cdcolor = '赤'");
int intResult = query.executeUpdate();
System.out.println("I:" + intResult);
tx.commit();
} catch (HibernateException ex) {
ex.printStackTrace();
tx.rollback();
} finally {
session.close();
}
}
ここでのTable003PKはデフォルトでMiddlegenで生成した時にプライマリキーのクラスが別に作成されますので、そのまま使用しています。
**TIPS
***SQL文の表示
hibernate.cfg.xmlに
<property name="show_sql">true</property>
を追加
** リンク
[[Hibernateリファレンス・ドキュメント>http://www.hibernate.org/hib_docs/reference/ja/html/]]~
[[Hibernate>http://www.techscore.com/tech/Others/Hibernate/index.html]]~
[[Hibernateで理解するO/Rマッピング(1)>http://www.atmarkit.co.jp/fjava/rensai3/ormap01/ormap01.html]]~
[[Hibernate 入門記>http://www.wikiroom.com/koichik/index.php?Hibernate%20%C6%FE%CC%E7%B5%AD]]~
サンプルで丁寧な解説があります。~
[[MiddlegenIDEプラグイン>http://www.atmarkit.co.jp/fjava/rensai3/eclipseplgn03/eclipseplgn03_3.html]]~
[[Hibernateトラブルシューティング>http://www.javaworld.jp/enterprise/-/21962-1.html]]~
[[ファイヤープロジェクト>http://www.h7.dion.ne.jp/~matsu/feature/hibernate/index.html]]~
[[hibernateを利用してはいけない5つのシチュエーション>http://www.everes.net/145]]~
このてのツールは癖がわかるまでに一苦労ありますね。楽に開発したいだけなんですが。
** 参考書籍
** コメント
-Hello, my name is Alex, i'm a newbie here. I really do like your resource and really interested in things you discuss here, also would like to enter your community, hope it is possible:-) Cya around, best regards, Alex! -- [[Alexdjgvr]] &new{2007-02-11 (日) 10:16:09};
--#comment