postgresqlの配列型のマッピング

708 views
Skip to first unread message

Kaneko

unread,
Aug 23, 2018, 4:50:52 AM8/23/18
to DBFluteユーザの集い
Kanekoです。

postgresqlの配列型(Text[]とか、Varchar[] とか)を、Javaの配列にマッピングされるようにしたいです。
typeMappingMap.dfpropに、下記の記述を追記しましたが、ダメでした。

    ; TEXT[]  = String[]

→ Stringにマッピングされる。

望んでいることとしては、
  TEXT[] → String[] にマッピングされる
  INT[] → Integer[] にマッピングされる
  BIGINT[] → Long[] にマッピングされる
になります。

何かいい方法ありましたら、ご教示ください。

DBFluteのバージョンは、1.0.5Nになります。

kubo

unread,
Aug 23, 2018, 4:56:20 AM8/23/18
to DBFluteユーザの集い
jfluteです

Kanekoさん、こんばんは

> → Stringにマッピングされる。
なるほど、そうですね。
何もしてないのでそうなりますね。

いま追加したばかりですが、未サポート型です。
http://dbflute.seasar.org/ja/manual/reference/dbway/postgresql/index.html#unsupportedtype

一方で、テストプロジェクトでは、
https://github.com/dbflute-test/dbflute-test-dbms-postgresql/blob/master/dbflute_maihamadb/dfprop/databaseInfoMap.dfprop#L116
独自のMyArray型にマッピングしていたりします。

typeMappingMapに色々と機能があります。
http://dbflute.seasar.org/ja/manual/reference/dfprop/typemapping/index.html

Kaneko

unread,
Aug 23, 2018, 5:09:15 AM8/23/18
to DBFluteユーザの集い
Kanekoです。

情報ありがとうございます。

    ; ARRAY  = java.lang.String[]

の設定を入れたところ、
当面の希望は満たされる結果となりました。
(TEXT[]のカラムがString[]にマッピングされる。)

ありがとうございました。

※JDBCがARRAYで返ってくる限り、
INT[]がInteger[]、BIGINT[]がLong[] にマッピングは、
かなり厳しいのだろうなと。。。


2018年8月23日木曜日 17時56分20秒 UTC+9 jflute:

Kaneko

unread,
Aug 23, 2018, 5:27:16 AM8/23/18
to DBFluteユーザの集い
kanekoです。

だがしかし、ClassCastException(当たり前か。。。)になるので、
もうひとひねりしてみます。

2018年8月23日木曜日 18時09分15秒 UTC+9 Kaneko:

kubo

unread,
Aug 23, 2018, 5:30:31 AM8/23/18
to DBFluteユーザの集い
jfluteです

> だがしかし、ClassCastException(当たり前か。。。)になるので、
> もうひとひねりしてみます。
曹操じゃなくてそうそう。

Kaneko

unread,
Aug 23, 2018, 6:41:32 AM8/23/18
to DBFluteユーザの集い
Kanekoです。

typeMappingMapに、

    ; ARRAY  = java.sql.Array

と記述。
最低限、Array型では受けれます。

で、DBアクセス側は、

SampleCB sampleCB = new SampleCB();
sampleCB.query().setId_Equal(1L);
SampleBhv sampleBhv = selector.select(SampleBhv.class);
Sample sampleEntity = sampleBhv.selectEntity(sampleCB);
String[] valueArr = ArrayUtils.toStringArray((Object[])sampleEntity.getValue().getArray());

とすれば、とりあえず、Stringの配列に最終的には受けれますが、、、、
・Object[]にCastしている時点で、DBFluteっぽくない。。。。
・その他いろいろと、DBFluteっぽくない。。。。
※TypeSafeに見えないし。。。実際、Array型がObjcet[]にCastしてExceptionを吐くことはまずないでしょうけど。。。

っぽくないけど、割り切るか。。。。。
せめて、Gapクラスにこのあたりのもの(Castとか)は、閉じ込めておくべきなんだろうなという感じはします。

2018年8月23日木曜日 18時30分31秒 UTC+9 jflute:

Kaneko

unread,
Aug 23, 2018, 6:45:46 AM8/23/18
to DBFluteユーザの集い
追記です。

Commons-Langには依存しています。

 
.String[] valueArr = ArrayUtils.toStringArray((Object[])sampleEntity.getValue().getArray());
 
じっさい、
String[] valueArr = (String[])sampleEntity.getValue().getArray();

でも通りますが、タイプセーフからはさらに遠ざかり、、、、なので、
ちょっとだけ悪あがきしてます。


2018年8月23日木曜日 19時41分32秒 UTC+9 Kaneko:

Kaneko

unread,
Aug 23, 2018, 9:44:54 PM8/23/18
to DBFluteユーザの集い
Kanekoです。

もっといい案あるぞという猛者求む。

2018年8月23日木曜日 19時45分46秒 UTC+9 Kaneko:

kubo

unread,
Aug 23, 2018, 9:50:48 PM8/23/18
to DBFluteユーザの集い
jfluteです

> 一方で、テストプロジェクトでは、
> https://github.com/dbflute-test/dbflute-test-dbms-postgresql/blob/master/dbflute_maihamadb/dfprop/databaseInfoMap.dfprop#L116
> 独自のMyArray型にマッピングしていたりします。

dfpropでMyArray型の定義だけじゃなくて、
MyArray用のValueTypeを初期化してあげれば、
MyArray型のマッピングできます。
https://github.com/dbflute-test/dbflute-test-dbms-postgresql/blob/2cc7bca313c5a8125ba5ae33df90a8d3b05698fe/src/main/java/org/docksidestage/postgresql/dbflute/nogen/ExtendedDBFluteInitializer.java#L29

そのための、DBFluteInitializerのオーバーライド。
https://github.com/dbflute-test/dbflute-test-dbms-postgresql/blob/2cc7bca313c5a8125ba5ae33df90a8d3b05698fe/dbflute_maihamadb/dfprop/littleAdjustmentMap.dfprop#L291

Kaneko

unread,
Aug 31, 2018, 4:29:14 AM8/31/18
to DBFluteユーザの集い
Kanekoです。

結論から言うと、うまくいきませんでした。

<やりたいこと>
・TEXT[] のカラムを(最終的に)、Stringの配列にしたい。
・更新をしたい。

<試したこと>
・提示いただいたものを、若干の調整をして導入
    → Stringの配列にできない。( {"a","b","c"}  という文字列が取得できるだけ。。。)
※うまく分解 & Stringの配列から、この文字列形式に簡単にできれば、問題なし。

・提示したものを基に、全体的にArrayで操作してみるようにする。
   → 更新がどうにもうまくいかない。。。
     entity.setXXX(new MyArray) みたいになるけど、結局、更新したい値のセット方法がない。
※Arrayはsetter系が一切ないので。。。
 
やりたいことと実現方法的に、もっとマッチしたものがあるのか考えてみる。

<実現したい業務要件>
マスタメンテ項目に、お客さんの独自項目の付加をしたい。
独自項目のタイプにチェックボックスがあり、チェック実体は複数可能なので、
1項目あたりの、複数値を保持しておく必要がある。

配列カラムでやろうかと思ってましたが、
値自体の保持は別テーブルでやることも検討し他方が良いのかもしれないですね。



2018年8月24日金曜日 10時50分48秒 UTC+9 jflute:
Reply all
Reply to author
Forward
0 new messages