我有以下 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(整数),它工作正常。
第二个输入是一个包含 languageId 的字符串 - 它是一个包含表示语言的数字的字符串,或者是列名称的字符串“targetLang”(=所有语言)
在我的java代码中,我做了以下事情:
Image.setInt(1, userID);
Image.setString(2, langID);
Image.executeQuery()
我的问题是,当我将字符串“targetLang”作为第二个参数发送时,准备好的语句将其插入为“targetLang”(带有“之前和之后”),使用数字这不是问题,因为 3='3',但是使用字符串,它给了我与我需要的不同的结果——我总是得到一个空的结果集,因为没有什么等于'targetLang'。我需要将此字符串插入到没有 '. 是否有可能或者我需要使用与准备好的语句不同的东西?
我知道我可以构建一个包含所有这些查询的字符串,但我正在寻找更优雅的 tnx
编辑:
这是创建表翻译链:
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”列拍摄图像。每个数字代表一种语言。
现在我有两个选项可以从该表中选择图像:
- 选择一种特定的语言,即给出一个数字作为第二个输入。
- 选择所有语言,即将第二个输入设置为列名“targetLang”。
所以我不比较固定字符串“targetLang”。我想为此列选择所有可能的值(从 translationChains 中选择 targetLang)。