2008年11月29日土曜日

HibernateでのSQL出力設定

HibernateではSQLをトレースしてくれます。
SQLを投げてるタイミングがわかったりして
結構重宝する場合がありますが、消す場合は

hibernate.cfg.xmlファイルの「show_sql」の部分をfalseにします。


<property name="show_sql">false</property>

HibernateのCriteriaでカウントなど

Hibernateをよく使いますが
CriteriaでアクセスをするとSQLを使うことはありません。

まずカウントの取得方法は

criteria.setProjection(Projections.rowCount()).uniqueResult();
//もしくは
Projections.countDistinct("プロパティ");

と行います。

DISTINCTは

criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);


などで行うことができます。

2008年11月26日水曜日

Strutsでダウンロード

ファイルのダウンロードを方法を記述する。

これは個人的な見解なのですが
よく、以下のようなAction上での記述が見受けられます。

//ダウンロード用のコンテンツタイプ設定
response.setContentType("application/octet-stream");
//ファイル名の設定(ヘッダ情報)
response.setHeader("Content-Disposition","attachment; filename=testcsv");
//各データの取得
OutputStream os        = response.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os, encode);
BufferedWriter writer  = new BufferedWriter(osw);

しかし、どうでしょうか。。。
例えば、writerに直接書き込んでるビジネスロジックの途中で、
Exceptionが起こると考えた場合、responseを記述している為、
Struts上の動作に戻ることが不可能ではないですか。。。

Strutsにおいて通常Viewで出力を行なう事を考えれば、
これはこれでおかしいのではないでしょうか?

ファイルがコピーレベルのデータだとしても、
JSP側でダウンロードを行なうのが筋のような気がしないでもないですね。
※処理最終でWriterに記述すれば障害の可能性が低くなることはわかっています。

それではJSPでダウンロードする感じを記述してみましょう!!

2008年11月24日月曜日

Treeを展開してみる

FlexでTreeを使用していますが
初期表示でTreeを展開したいと思いました。

すべての設定終わった後に動作するcallLater()を使用するようです。

初期化系のメソッド内でこれを行い、

tree.dataProvider = wkXML;
//ノードを展開する
callLater(expandFirstNode);


でそのメソッドを定義します。


//ツリーを展開する
private function expandFirstNode():void
{
//ディレクトリ選択
tree.selectedIndex=0;
//ルートを展開
tree.expandItem(tree.dataProvider.getItemAt(0),true);
}


これで初期化と同時にツリーが展開します。

HSQLDBでのLimit文

DBをPostgreSQLからHSQLDBに移行することになったのですが
不覚にもPostgreSQLでLimit文を使っていました。
こりゃ、移行断念か。。。。と思いましたが
以下で指定した行数を取得できるようです。

SELECT LIMIT 0 10 [カラム名] FROM [テーブル名]

0が開始行、10が取得行数になります。0から始まります。
行数より大きな数字等を渡してもエラーにはならないようです。

HSQLDBのインストールと起動

Javaが存在すれば動作するDBです。
簡易的にテストしたりするには適しています。

http://hsqldb.org/

からダウンロードしてきます。
ダウンロードしたファイルを解凍して
demo/runServer.batを見ればわかりますが


cd ..\data
@java -classpath ../lib/hsqldb.jar org.hsqldb.Server %1 %2 %3 %4 %5 %6 %7 %8 %9


で起動することが可能です。

文字列コードなどを指定する場合はJavaコマンドに
-Dsqlfile.charset=Windows-31J
などを追加します。

runManager.batでSQLを直接打つことも可能です。

起動した際に「server.properties」という記述があります。
ここにデータベース名などを記述して起動することも可能です。


起動したコンソールをCtrl+Cで閉じるとシャットダウンします。

2008年11月23日日曜日

FileReferenceのセッション継続

Flexでのアップロード、ダウンロードを行う場合
「FileReference」を使用しますが、
WebServiceなどを通じて接続されたセッション情報を継続できません。
下記行わなくてもIEでは操作できましたが、
FirefoxやCromeでは不可能でした。おそらくCookieの関係でしょうね。


私の場合はTomcat→Strutsを使用してサービスを構築していますので
ActionForm値を使用してアップロードを行います。
Session継続を行っても新しいFormのインスタンスを生成してしまいます。
なので初回インスタンスを生成した時にRequestから


request.getSession().getId()


の値を取得して、Flexに返します。
FlexではセッションIDを何らかの形で保存しておきます。
でFileReferenceを使用する際に使用するURLRequestが使うURLに
jsessionidとして設定してあげます。


var request:URLRequest = new URLRequest();
request.url = uploadUrl + ";jsessionid=" + sessionId;
reference.upload(request);


すると同一のセッションで値をやりとりすることが可能です。
能書きから行くとおそらくログイン情報の共有等もこれでできるでしょう。

セキュリティ的にこれでよいのかは不問の方向で!