2013-10-29 114 views
0

我需要在我的查詢生成器的having子句中使用佔位符。 我試過用「?」馬克後來我得到: java.sql.SQLException: argument holder index 1 not valid, only 1 in statement在ormlite中使用SelectArg having子句?

這是我試圖完成的事情:

QueryBuilder<ArchiefTag, Integer> archiefTagQb = helper 
     .getArchiefTagDao().queryBuilder(); 

tagSelectArg = new SelectArg(); 

archiefTagQb.where().in(ArchiefTag.TAG_FIELD, tagSelectArg); 
archiefTagQb.groupBy(ArchiefTag.ARCHIEF_ENTRY_FIELD); 

QueryBuilder<ArchiefEntry, Date> archiefEntryQb = helper 
     .getArchiefEntryDao().queryBuilder(); 
archiefEntryQb.join(archiefTagQb); 

//the having must be on the outer join query. Don't know why 
archiefEntryQb.having(String.format("COUNT(%s) = ?",ArchiefTag.TAG_FIELD)); 

preparedGetArchiefForTags = archiefEntryQb.prepare(); 

生成的SQL是:

SELECT `ARCHIEF_ENTRY`.* 
FROM `ARCHIEF_ENTRY` 
INNER JOIN `ARCHIEF_TAG` ON `ARCHIEF_ENTRY`.`id_entry` = `ARCHIEF_TAG`.`entry` 
GROUP BY `ARCHIEF_TAG`.`entry` 
HAVING COUNT(tag) = ? 

但是,當我打電話: preparedGetArchiefForTags.setArgumentHolderValue(1, 3); 以上發生異常。

任何想法如何解決這個問題?

回答

0

但是當我打電話:preparedGetArchiefForTags.setArgumentHolderValue(1,3);以上例外。

如果你看一看的javadocs for the setArgumentHolderValue(...) method,該index參數應根據0和 1等基於SQL。

報價:

指數 - 你要設置,基於0持有者的指數。請參閱上面的注。

所以,你的代碼應該是:

preparedGetArchiefForTags.setArgumentHolderValue(0, 3); 

我已經調整了異常,使這個較爲平淡。

throw new SQLException("argument holder index " + index + " is not valid, only " 
    + argHolders.length + " in statement (index starts at 0)"); 
+0

仍然得到異常'值java.sql.SQLException:論點持有人指數0無效,在statement' – Vrolijkx

+0

只有0您曾經有過在聲明1,所以我覺得你的查詢必須有哪些變化? @Vrolijkx – Gray

+0

nope聲明沒有改變,但我現在看到,我忘記了生成的sql中的一塊。但我使用executeRaw()解決了這個問題 – Vrolijkx