73280

[code]

     targetQuery
            .append("WHERE ")
            .append("g.grp_id = ?").attachString(GrpId)
            .append(" AND g.sale_price <> ").append(genQuote(ConstDefin.SALE_OFF));
    
[/code]

.append //Java 文字列追加  
.attachString 検索してもはっきりした答えが不明なのですが、javaのメソッドでしょうか？

genQuote(ConstDefin.SALE_OFF)
は、genQuoteメソッドにConstDefin.SALE_OFFの引数を渡しているので間違いないでしょうか？

AND g.sale_price <>
のsqlに対してgenQuote(ConstDefin.SALE_OFF)はsqlではないのに、<>は比較対象になるのでしょうか？

教えて頂きたいです。


CC BY-SA 4.0
2021-01-13T11:01:49.943
73270
2021-01-14T01:16:47.780
32774
question
java sql
sqlコードが解読できません


`targetQuery`変数のクラスが分かりませんので回答のほとんどが推測ですが、一般的なクエリ作成クラスになぞらえた考え方をご回答いたします。

おそらくご質問のコードの`targetQuery`には下記のようなSQL文が入っている状態だと思います。

`SELECT * FROM goods g `

ご質問のクラスでは、ここに`.append({文字列})`することでSQL文の末尾に文字列を追加して、戻り値として`targetQuery`自体を戻す`append`メソッドを用意しているのでしょう。

なので`targetQuery.append("WHERE ")`を呼び出すことでSQL文は下記になります。

`SELECT * FROM goods g WHERE `

`targetQuery.append("WHERE
")`の戻り値は上記のSQLが入った`targetQuery`なので、`append`メソッドを繰り返して呼び出すことができます。  
戻り値として変数自体を返し、メソッドを繰り返し呼び出すコードを **メソッドチェーン** と言います。

同様にメソッドチェーンで呼び出される`targetQuery.append("g.grp_id = ?")`でSQL文が下記になります。

`SELECT * FROM goods g WHERE g.grp_id = ?`

このSQL文のWHERE句は右辺が`?`になっているので動作しません。  
そこで`targetQuery`クラスには、右辺を書き換えるための`attachString`メソッドが用意されています。  
例えば`String GrpId = "1";`だと仮定すると、SQL文は下記になります。

`SELECT * FROM goods g WHERE g.grp_id = 1`

なぜ`append`メソッドで直接`g.grp_id =
'1'`を追加せずに`attachString`メソッドで`?`を書き換える方式になっているのでしょうか？  
`?`を使って値を代入する方式のSQLは **プレースホルダ** と呼ばれています。  
プレースホルダでセキュリティや実行速度を高めたりできますが、詳細な説明は省略します。  
興味のある方は[安全なSQLの呼び出し方](https://www.ipa.go.jp/files/000017320.pdf)をご覧ください。

さてメソッドチェーンの`targetQuery.append(" AND g.sale_price <> ")`でSQLは下記になります。

`SELECT * FROM goods g WHERE g.grp_id = 1 AND g.sale_price <> `

次の`ConstDefin.SALE_OFF`は **定数** を示す文字列なのでしょう。  
`ConstDefin`クラスの中に`public final String SALE_OFF =
"安売り";`のようなコードが入っているのではないでしょうか。("安売り"の文言は適当です)

そして現在動作中のクラスに`genQuote`メソッドが存在すると思います。  
メソッド名から考えると、文字列の前後にクォーテーションを生成(ジェネレート)する機能でしょう。

そのためメソッドを分解すると、  
`.append(genQuote(ConstDefin.SALE_OFF))`は  
`.append(genQuote("安売り"))`と等価であり、  
`.append("'安売り'")`と等価です。

上記を仮定すると最終的なSQLは下記になります。

`SELECT * FROM goods g WHERE g.grp_id = 1 AND g.sale_price <> '安売り'`

このSQLならば`g.sale_price`が安売りを示す特殊な文字列と比較をしていることが分かると思います。(なぜこちらはプレースホルダを使っていないのか不明です)

ご質問の回答としては、`append`や`attachString`などすべてのコードがSQL文を構築するために用意されたJavaのメソッドや定数です。  
メソッドの引数を実際の値に書き換えながら考えていくことでコードの解読に役立ちます。


CC BY-SA 4.0
2021-01-14T01:16:47.780
73280
2021-01-14T01:16:47.780
9820
73270
answer