ParameterBean の作成方法について

180 views
Skip to first unread message

Kenzoh Sekitoh

unread,
Feb 12, 2018, 5:03:29 AM2/12/18
to DBFluteユーザの集い
皆さん、こんにちは。

OutsideSql の使い方についてわからないところがあるので、どなたか教えてください。

以前 dbflute ver 1.1 のときに outsideSql を利用したとき(対象DB:postgresql )は、以下の記述をした場合、

-- #df:entity#
-- !df:pmb extends Paging!
-- !!List<String> nameList:likeContain!!
-- !!LocalDateTime age!!
-- !!AutoDetect!!

自動生成される ParameterBean の定義は、以下のようになっていました。
 public class BsdbfluteVer111Pmb extends SimplePagingBean implements EntityHandlingPmb<CustomerBhv, CustomerTreeQuery>, ManualPagingHandlingPmb<CustomerBhv, CustomerTreeQuery>, FetchBean {

これが現在の開発環境(dbflute ver 1.1.6 対象DB MSSQL SERVER 2012) なりますと、
outside SQL ファイルに以下の定義があった場合、

-- #df:entity#
-- !df:pmb extends Paging!
-- !!AutoDetect!!

public class MsBsDbFluteVer116Pmb extends SimplePagingBean implements ParameterBean, FetchBean {

となり、PagingHandling 系のインタフェースが定義されないまま出力されてしまいます。

この違いがどこからくるのかわからず、検索ページをうまく作ることが出来ていません。バージョンの違いが問題になっているとも思えないのですが、確認ポイントなどありましたら、
ヘルプ願います。

何卒よろしくお願いします。



Kenzoh Sekitoh

unread,
Feb 12, 2018, 7:20:22 AM2/12/18
to DBFluteユーザの集い
自己レスです。

SQL SERVER を対象とするときに、ParameterBean が Paging 対応 となるための条件ですが、


によると、row_number() 関数を、件数カウントのために用いること、とありました。見落としてました。すみません。

で、この条件に沿うように、SQLを書き換えてみたのですが、Sql2Entity の方で、未だ PagingBean として扱ってもらえません。
WITH メソッドを使っているのですが、それが良くないのでしょうか?
問題点をうまく表現できているかどうかわかりませんが、現在のSQLを端折って載せてみます。問題箇所してきただければ幸いです。


/*
 [df:title]
  お客様検索。

 [df:description]
  SQL Description here.
*/

-- #df:entity#
-- !df:pmb extends Paging!
-- !!AutoDetect!!
WITH CUSTOMER_BASIC AS
(
SELECT .....
FROM M_Customer M
WHERE NOT EXISTS
(SELECT * FROM R_CUSTOMER R WHERE M.CustomerID = R.CustomerID)
AND updateDate >= DATEADD (month,  -12, GETDATE())
UNION
SELECT ...
FROM R_Customer
WHERE updateDate >= DATEADD (month,  -12, GETDATE())
), plain as (
/*IF pmb.isPaging()*/
SELECT *
--ELSE select count(*)
/*END*/
    FROM CUSTOMER_BASIC
    /*BEGIN*/
    WHERE
      /*IF pmb.jpName != null*/
      LastName + FirstName LIKE /*pmb.jpName*/'%田%'
      /*END*/
      .... 検索条件色々記載
    /*END*/
)
, ext as (
/*IF pmb.isPaging()*/
SELECT  (select count(*) from plain) as TotalCount,  row_number() over(order by plain.UpdateDate DESC) as RowNumber, *
--ELSE SELECT COUNT(*) As TotalCount
/*END*/
FROM plain)
select * from ext
/*IF pmb.isPaging()*/
 where ext.RowNumber > /*pmb.pageStartIndex*/0
   and ext.RowNumber <= /*pmb.pageEndIndex*/20
 order by ext.RowNumber asc
/*END*/




2018年2月12日月曜日 19時03分29秒 UTC+9 Kenzoh Sekitoh:

kubo

unread,
Feb 12, 2018, 8:27:23 AM2/12/18
to DBFluteユーザの集い
jfluteです

Sekitohさん、こんばんは。
バージョンは近いので(1.1 と .1.1.6)、そこは関係無さそうですね。
やはり、お気づきの通り PostgreSQL と SQLServer の違いですね。

with句の有無はあんまり関係無さそうに思えますが、
試しに、SQLをすごくシンプル (with句を使わないなど) にして、
もう一度自動生成し直してみて頂けますでしょうか?


ちなみに、DBFluteのSQLServerのテスト環境はこちらになります。
ただ、SQLServerを動かす環境を用意するのが厳しく、
(DBFluteとの組み合わせ的に)利用者も少ないので、
ちょっと放置ぎみです。。。m(_ _)m
https://github.com/dbflute-test/dbflute-test-dbms-sqlserver


※SQLServer on Linux のDockerイメージ、もうあるんだっけかな...

kubo

unread,
Feb 12, 2018, 8:54:38 AM2/12/18
to DBFluteユーザの集い
jfluteです

加えて、基本部分ですが念のため、
basicInfoMap.dfprop の database プロパティは、
sqlserver になっているか確認お願いします。

ソースコードを見ると、DBMSごとに分岐して、
非常に単純なロジックになっていまして...
https://github.com/dbflute/dbflute-core/blob/21192aa0f4690f6f34b8c14c5f4d1d59d1e32aa7/dbflute-engine/src/main/java/org/dbflute/logic/sql2entity/pmbean/DfPmbMetaData.java#L347

} else if (getBasicProperties().isDatabaseDB2()) {
return Srl.containsAllIgnoreCase(sql, "row_number()");
} else if (getBasicProperties().isDatabaseSQLServer()) {
return Srl.containsAllIgnoreCase(sql, "row_number()");

Kenzoh Sekitoh

unread,
Feb 12, 2018, 11:34:48 AM2/12/18
to DBFluteユーザの集い
jflute さん、こんにちは。

basicInfoMap.dfprop の確認、シンプルな構文への変換などやってみましたが、結果変わらずです。
ひとまずご報告まで。



2018年2月12日月曜日 22時54分38秒 UTC+9 jflute:

kubo

unread,
Feb 12, 2018, 11:59:41 AM2/12/18
to DBFluteユーザの集い
jfluteです

Sekitohさん、ありがとうございます。
ふむぅ...

実装的には、回避的な手段ですが、明示的にManualPagingと指定することができるはずなので、
このように記述して試してみてください。(取り急ぎ開発が止まらないようにと)

-- !df:pmb extends ManualPaging!



コードも、以下のように感じになっています。

DfPmbMetaData:
protected boolean judgeTypedPagingHandling(DfPagingType targetType) {
if (!isRelatedToBehaviorQuery() || !isRelatedToCustomizeEntity()) {
return false;
}
if (!hasPagingExtension()) {
return false;
}
if (DfPagingType.UNKNOWN.equals(_pagingType)) { // "extends Paging"
final boolean research = researchManualPaging();
return DfPagingType.MANUAL.equals(targetType) ? research :
!research;
} else {
// "extends ManualPaging" or "extends AutoPaging"
return targetType.equals(_pagingType);
}
}




# MacBook でしっかりSQLServerの環境を整えないとですね。
# これ使えるのかな...
# // Docker を使用した SQL Server 2017 コンテナー イメージを実行します。
# https://docs.microsoft.com/ja-jp/sql/linux/quickstart-install-connect-docker

Kenzoh Sekitoh

unread,
Feb 12, 2018, 12:18:31 PM2/12/18
to dbf...@googlegroups.com
jflute様、遅くまでお付き合いいただき恐縮です。

Paging, ManualPaging , SPB どっちも試したんですが、全然出力されないです。

プロジェクト自体の特徴的な部分としては、
1,postgresql, sqlserver の複数DB体制であること。
2,そのため、sqlserver には、Prefix をつけていること。
3. 出力先のパッケージ名を、DBごとに切り分けていること。

が挙げられます。Ver 1.1.1,1.1.6 の双方で試してみています。
dbflute-engine のログ出力設定をDebug モードにしてログ解析などできる設定がありましたら、教えてください。

とにかくエンティティと紐付かないので。。。
なにか見落としがある可能性もあり。。

(各なる上は、TradisitonalStyle に挑戦でしょうか?)

# 当方は Ubuntu-MATE に、SQL SERVER ON Linux をインストールして開発に使っています。
# もしかして開発環境も関係あるのでしょうか。。



--
  Kenzoh Sekitoh
  Mobile: 090-4176-9357

2018年2月13日 1:59 kubo <dbf...@gmail.com>:

--
このメールは Google グループのグループ「DBFluteユーザの集い」の登録者に送られています。
このトピックの登録を解除するには https://groups.google.com/d/topic/dbflute/M5MbJkKe0VQ/unsubscribe にアクセスしてください。
このグループから退会し、グループのすべてのトピックの登録を解除するには dbflute+unsubscribe@googlegroups.com にメールを送信してください。
このグループに投稿するには、dbflute@googlegroups.com にメールを送信してください。
https://groups.google.com/group/dbflute からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/d/optout にアクセスしてください。

kubo

unread,
Feb 12, 2018, 4:20:58 PM2/12/18
to DBFluteユーザの集い
jfluteです

Sekitohさん、ありがとうございます。

> プロジェクト自体の特徴的な部分としては、
> 1,postgresql, sqlserver の複数DB体制であること。
> 2,そのため、sqlserver には、Prefix をつけていること。
> 3. 出力先のパッケージ名を、DBごとに切り分けていること。

なるほど、そのくらいしか違いが見当たらないですね...
どこかで作用して、もっと違うところで分岐しちゃっているのかも。
自分の方でもちょっとコードレベルで少し追ってみますね。

> dbflute-engine のログ出力設定をDebug モードにしてログ解析などできる設定がありましたら、教えてください。

ああぁ、Engine側はあんまり用意されてないですね...
(Runtime側は、DBFluteConfigにinternalDebugがありますが)

> (各なる上は、TradisitonalStyle に挑戦でしょうか?)

開発の進捗的に先に進まないといけないのであれば、
いったん TradisitonalStyle で対応という感じでお願いします。
(TODOコメントとか入れて、後でちゃんとした形にしたいとか)

> # 当方は Ubuntu-MATE に、SQL SERVER ON Linux をインストールして開発に使っています。
> # もしかして開発環境も関係あるのでしょうか。。

なるほどぅ。
まあ、ロジック的にはあまり関係無さそうではあります。

kubo

unread,
Feb 12, 2018, 4:25:28 PM2/12/18
to DBFluteユーザの集い
jfluteです

> プロジェクト自体の特徴的な部分としては、
> 1,postgresql, sqlserver の複数DB体制であること。
> 2,そのため、sqlserver には、Prefix をつけていること。
> 3. 出力先のパッケージ名を、DBごとに切り分けていること。

outsideSqlMap.dfprop の sqlPackage など、
dfprop 周りも何か設定されているでしょうか?

例えば、こちらのページのような設定をされていますでしょうか?

// 複数DB
http://dbflute.seasar.org/ja/manual/function/genbafit/projectfit/multipledb/index.html

kubo

unread,
Feb 12, 2018, 5:42:53 PM2/12/18
to DBFluteユーザの集い
jfluteです

五月雨で申し訳ないですが、
加えて...

普通のリスト検索でTypedParameterBeanになるでしょうか?
(df:pmbでextendsなしでやるとどうなるか?)

ページングの判定の問題なのか、
そもそもTypedParameterBeanの条件に合致してないのか、
そこの切り分けをしたくて。

Kenzoh Sekitoh

unread,
Feb 12, 2018, 11:41:02 PM2/12/18
to dbf...@googlegroups.com
jflute 様

お手数おかけして恐縮です。
諸々今晩までに返信します。複数DBの設定は行っています。
作業的には、一旦、Postgresql の FOREIGN TABLE の機能を使って、SQL SERVER のデータを透過するようにして対応しています。
ただ読み込みのみなので。。

ひとまず以上です。

--
  Kenzoh Sekitoh
  Mobile: 090-4176-9357

2018年2月13日 7:42 kubo <dbf...@gmail.com>:

Kenzoh Sekitoh

unread,
Feb 18, 2018, 7:56:50 AM2/18/18
to DBFluteユーザの集い
jflute 様

返信遅れて申し訳ございません。 。
ご指定の条件で回してみましたが、型指定のImplementsは設定されませんでした。

簡単ですが、ご報告まで。

2018年2月13日火曜日 7時42分53秒 UTC+9 jflute:

kubo

unread,
Feb 18, 2018, 8:04:56 AM2/18/18
to DBFluteユーザの集い
jfluteです

Sekitohさん、ありがとうございます。

> ご指定の条件で回してみましたが、型指定のImplementsは設定されませんでした。
ページングに限らず普通のリスト検索でもimplementsされないのであれば、
「外だしSQLの配置パッケージが違う (exbhvじゃないて)」とか、
複数DB対応したことによって想定パッケージがズレてしまっているとか、
そういうことが考えられます。

まあお時間ある時でいいので、
その辺の情報(dfpropや外だしSQLのパッケージなど)を、
教えて頂けると嬉しいです。
(見れば「あっ、これ」とかわかるかも)


※こちらで、projectPrefix付けたり複数DBでやる設定を
色々と試しましたが、正常に動作したもので...

Kenzoh Sekitoh

unread,
Mar 6, 2018, 5:09:31 AM3/6/18
to dbf...@googlegroups.com
jflute さん

レスが遅くなって申し訳ないです。
タイポ発見しました。ごめんなさい。


2018年2月18日 22:04 kubo <dbf...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages