SQL文の直接実行について

570 views
Skip to first unread message

志水正幸

unread,
Dec 25, 2019, 4:32:37 AM12/25/19
to DBFluteユーザの集い

志水です。

いつも大変お世話になっております。

動的な条件でパターン数や条件数も多数あるので
OutSideSqlでif文分岐を使ったりせずどうにかできないかな?
と思ったのですが、SQL文のWhere文以下を
パラメータとして実行できないのでしょうか?


過去ログ調べてたら
「[Seasar-user:18928] Re: 【DBFlute】 SQL文の直接実行」
がでてきたので真似してみたのですが
sql2entity.batでちょっと意味のわからないエラーになってしまいました。
また、この過去ログの最後って以下のところで終わっているのですが
結局どうなったのかわかりますか?
 > Selectも含む(つまりEntityへのマッピングも含む)のであれば、
 > 外だしSQL(OutsideSql)の仕組みを利用した方が楽でしょう。
仮に、selectするカラムの個数が動的に変わる場合、
Entityのマッピングって、どうなるんでしょう?


以上、宜しくお願い致します。



dbflute.log

kubo

unread,
Dec 25, 2019, 5:35:54 AM12/25/19
to DBFluteユーザの集い
jfluteです
志水さん、こんばんは


> と思ったのですが、SQL文のWhere文以下を
> パラメータとして実行できないのでしょうか?

できなくはないと思います。

埋め込み変数コメントで、そのままSQLに文字列を渡すことができます。
http://dbflute.seasar.org/ja/manual/function/ormapper/outsidesql/pmcomment.html#embeddedvariable


> sql2entity.batでちょっと意味のわからないエラーになってしまいました。

org.seasar.dbflute.exception.SQLFailureException: Look! Read the message below.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Failed to execute the SQL!

[SQL File]
..¥..¥Source¥SGMDB¥DBFlute¥ExBhv¥TMitsumoriHeadBhv_SelectMitsumoriData201.sql

[Executed SQL]
-- #SelectMitsumoriData201#



-- #df:x#
/*$pmb*/

[SQLState]
null

[ErrorCode]
0

[SQLException]
com.microsoft.sqlserver.jdbc.SQLServerException
ステートメントは ResultSet を返しませんでした。
* * * * * * * * * */

ResultSet というのは結果セット、つまり、select文の結果(レコードの集まり)のことで、
Javaではそのまま ResultSet というクラスで検索結果が戻ってきます。
(ADO.NETだと、DataReaderがそれに相当します)

「ステートメントは ResultSet を返しませんでした。」
ということなので、そのselect文が結果セットを戻さないものだったということですね。
(0件と違って、SQLの結果が結果セットに形になってないということですね)
で、Executed SQLを見ると、select文になってないので上記のエラーになっています。
Sql2Entityで実行するSQLは、必ずselect文である必要があります。

-- #df:x# が効いていないかもですね。(DBFlute Engineが古くて)
これを宣言すると、Sql2Entityの実行対象から外れるはずですが。

一方で、where句だけ動的にしたいのであれば、
select句は普通に外だしSQLで書いてSql2EntityでEntity作る方が良いとは思います。

一方で一方で、「動的な条件でパターン数や条件数も多数あるので」がどのくらいか次第ですけど、
できる限り動的なSQL文字列を組み立てるというのはやらないほうが良いという感じはあります。
一応、お約束として。「DBFluteは動的なSQL文字列に積極的ではない」と。


> また、この過去ログの最後って以下のところで終わっているのですが
> 結局どうなったのかわかりますか?
> > Selectも含む(つまりEntityへのマッピングも含む)のであれば、
> > 外だしSQL(OutsideSql)の仕組みを利用した方が楽でしょう。
> 仮に、selectするカラムの個数が動的に変わる場合、
> Entityのマッピングって、どうなるんでしょう?

あれ、どこで見てます?自分のgmailで検索すると...その後の返事として:

マッピングは、とにかくSelect句のカラムと対応する
Entityのプロパティがあれば、そこに格納していく
というだけなので、実行するSQLに合わせてEntityを
設定すればOKです。

と返しています。

志水正幸

unread,
Dec 25, 2019, 11:57:15 PM12/25/19
to DBFluteユーザの集い
志水です。

jfluteさん、こんにちは。


>-- #df:x# が効いていないかもですね。(DBFlute Engineが古くて)
Java版のみかもしれないですね。


>一応、お約束として。「DBFluteは動的なSQL文字列に積極的ではない」と。
そうですね。
やはり、工数がかかり大変かもしれないですが
いつものやり方でやるほうがいいように思えてきました。
まぁ作業は担当者さんなんですけど(笑)


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




Reply all
Reply to author
Forward
0 new messages