6

次のSQLステートメントがあります。

Select i.imageID, theImage, translationRating
From images i
inner join translationchains  t
on t.imageId = i.imageid
where i.userID=(someUserID) And i.translated =0 
and t.targetLang in (select targetLang from translationChains)

Javaコードで使用する準備済みステートメントにしたい:

Select i.imageID, theImage, translationRating
From images i
inner join translationchains  t
on t.imageId = i.imageid
where i.userID=? And i.translated =0 
and t.targetLang in (select ? from translationChains)

最初の入力?はユーザー ID (整数) であり、正常に動作しています。

2 番目の入力は、languageId を含む文字列です。これは、言語を表す数値を含む文字列、または列の名前 (= すべての言語) である文字列「targetLang」のいずれかを含む文字列です。

私のJavaコードでは、次のことを行いました:

Image.setInt(1, userID);
Image.setString(2, langID);
Image.executeQuery()

私の問題は、文字列「targetLang」を2番目のパラメーターとして送信するときです。準備されたステートメントは、それを「targetLang」として挿入します(「前と後」を使用)。数値では、3 =「3」であるため問題ありませんが、文字列を使用すると、必要なものとは異なる結果が得られます-「targetLang」に等しいものがないため、常に空の結果セットが返されます。この文字列を ' なしで準備済みステートメントに挿入する必要があります。それは可能ですか、または準備されたステートメントとは異なるものを使用する必要がありますか?

このすべてのクエリを含む文字列を作成できることはわかっていますが、よりエレガントな tnx を探しています


編集:

これは、Create table translationChains です。

Create Table if not exists TranslationChains (
  ImageID int (10) NOT NULL,  
  SourceLang int NOT NULL,
  TargetLang int NOT NULL,
  Translated tinyint default 0,
  Translation text,
  Translator varchar (30),
  CONSTRAINT translate_image PRIMARY KEY (ImageID,SourceLang, TargetLang),
  FOREIGN KEY (ImageID) REFERENCES Images(ImageID) ON DELETE CASCADE,
  FOREIGN KEY (SourceLang) REFERENCES Languages(languageID) ON DELETE CASCADE,
  FOREIGN KEY (TargetLang) REFERENCES Languages(languageID) ON DELETE CASCADE)

ご覧のとおり、int列である「targetLang」列に従って画像を取得しようとしています。各数字は言語を表します。

そのテーブルから画像を選択するには、次の 2 つのオプションがあります。

  • 特定の言語を選択します。つまり、2 番目の入力として数値を指定します。
  • すべての言語を選択します。つまり、2 番目の入力を列名「targetLang」に設定します。

したがって、固定文字列「targetLang」と比較していません。この列に可能なすべての値を選択したい (translationChains から targetLang を選択)。

4

2 に答える 2

0

あなたは変えられる:

および t.targetLang in (translationChains から ? を選択)

に:

and (
        (
            ? = 'targetLang' and
            t.targetLang in (
                                    select
                                        targetLang
                                    from
                                        translationChains
                            )
        )
        or
        ? = t.targetLang
    )

setString(3,langId) を作成します。つまり、3 番目のパラメーターを 2 番目と同じにします。決して、私の知る限り、これはよりエレガントまたはより効率的ですが、うまくいくはずです!

于 2013-04-04T19:15:59.347 に答える