2017-02-17 110 views
2

工作怎麼說,我可以執行以下查詢只是在SQL服務器SQL Server查詢運行SQLServer的內部罰款,但相同的查詢不JDBI

SELECT notificationMessage FROM NotificationMessages WHERE timesUsed < 2 

但罰款時,查詢被稱爲

@SqlQuery("SELECT notificationMessage FROM NotificationMessages WHERE timesUsed < 2") 
List<String> getNotificationMessages(); 

我得到以下錯誤

有一個在一個上下文,其中僅一個非布爾類型的表達有預計'timeUsed'附近的條件

只是谷歌翻譯它的快速通道。另一個有趣的事情是,我的異常消息以丹麥語打印 - >只有sql例外。我曾嘗試在Sql Server中運行SET LANGUAGE English幫助,但未在Intellij中的jdbi發出異常消息。

編輯1如果有人有同樣的問題,那麼我去解決方案SELECT所有消息,然後做所有的代碼邏輯。我不喜歡的東西如下:

public interface NotificationDAO { 
@SqlQuery("SELECT id, notificationMessage, timesUsed, messageType, messageDays FROM NotificationMessages WHERE messageType = 'REMINDER'") 
    List<NotificationMessage> getReminderNotificationMessages(); 
} 

public class NotificationResource { 
    ... 
    private NotificationMessage pickNotificationMessage(){ 
     List<NotificationMessage> notificationMessages = notificationDAO.getReminderNotificationMessages(); 
     // Extract the number of times a message has been sent out to users, store in Integer list. 
     List<Integer> timesUsedList = notificationMessages.stream().map(nm -> nm.getTimesUsed()).collect(Collectors.toList()); 
     // Remove all those messages which have been used once more than others. //TODO maybe another type of removal of messages 
     List<NotificationMessage> notificationMessagesTruncated = notificationMessages.stream().filter(nm -> nm.getTimesUsed() <= Collections.max(timesUsedList)-1).collect(Collectors.toList()); 
     ... 
    } 
    ... 
} 

EDIT 2 @zloster我不會說這是你所鏈接的帖子完全相同的副本。因爲他們的問題是將一個列表綁定到查詢上,所以我對我的解決方案工作得很好。我的問題是,我無法弄清楚爲什麼我不能在我的查詢上做出比操作簡單的操作,例如WHERE 1 < 2.我沒有意識到<是StringTemplate的保留字符。但是,你給的鏈接有我的問題的解決方案「......括號<這樣\ < ...」,但我不同意說它自己的問題是重複的。

所以他們的問題是「你如何將列表綁定到SQL查詢語句?」

凡爲我的問題是

「爲什麼比較運算符不JDBI SQL工作」,並且是當然的,因爲我用的是註釋@UseStringTemplate3StatementLocator使我的列表映射到IN語句。我有工作,他們沒有。但是我無法讓自己的行動低於或高於任何形式的行動。

+0

可能重複[Jdbi - 如何綁定Java中的列表參數?](http://stackoverflow.com/questions/32526233/jdbi-how-to-bind-a-list-parameter-in-java) – zloster

+0

@zloster我不會說這是你正在鏈接的帖子的確切副本。因爲他們的問題是將一個列表綁定到查詢上,所以我對我的解決方案工作得很好。我的問題是,我無法弄清楚爲什麼我無法對我的查詢做一個簡單的'低於'操作,例如'WHERE 1 <2'。我沒有意識到'<'是StringTemplate的保留字符。但是,你給的鏈接有我的問題的解決方案'「......括號<像這樣\\ <...」',但我不同意說它自己的問題是重複的。 – TheLearner

回答

0

我已經找到了我的查詢問題的解決方案,尋找在JDBI另一個話題我偶然發現了這個post 我注意到這句話尤其

也要注意,使用此批註,則不能使用' <'字符在您的SQL查詢中無需轉義(因爲它是StringTemplate使用的特殊符號)。

,我使用註釋@UseStringTemplate3StatementLocator在我的界面,我已經測試了它,並將它與gt, lt, gte, lte運營商的工作時,他們與\\逃脫。因此,如果有人使用相同的註釋並且與我的問題相同,那麼如果使用這些查詢運算符<, >, <=, >=,則可以解決此問題。

+0

你爲什麼使用StringTemplate和JDBI?我對該主題的探索表明它們非常相似,並且使用JDBI,您不需要StringTemplate,因爲它們本質上使用相同的方法來對SQL查詢執行進行建模(從應用程序代碼角度來看)。 – zloster

+0

@zloster因爲我有一些查詢,我使用'IN(...)'語句並且能夠在'IN'語句中綁定我的組,所以我需要註釋來使'@ BindIn'工作。看到我鏈接到的上述帖子。我選擇在Class級別上做,也許我可以在方法級別上完成它,但我還沒有嘗試過。因爲'<'然後通過StringTemplate獲得保留字符,所以它不能在查詢中用作'低於'運算符。如果你知道一個更好的方法來在一個'IN(...)'語句中映射一個組,我就是所有的耳朵:)。 – TheLearner

+0

感謝您的解釋。我錯過了JDBI中的解決方案要求'StringTemplate'。這提醒我在即將發佈的JDBI 3中檢查這是如何處理的。我在這裏發現了非常類似的問題:http://stackoverflow.com/questions/32526233/jdbi-how-to-bind-a-list- java中的參數在那裏檢出鏈接的文章。它來自JDBI的原作者。有兩種方法被描述:數據庫特定的,另一種使用'StringTemplate'。 – zloster