SQL Server中的Sql Server查询运行正常,但相同的查询不适用于JDBI

时间:2017-02-17 10:02:58

标签: mysql sql-server intellij-idea jdbi

为什么我可以在Sql Server中正确执行以下查询

SELECT notificationMessage FROM NotificationMessages WHERE timesUsed < 2

但是在

中调用查询时
@SqlQuery("SELECT notificationMessage FROM NotificationMessages WHERE timesUsed < 2")
List<String> getNotificationMessages();

我收到以下错误

  

在上下文中只有一个非布尔类型的表达式   预计'timeUsed'附近有一个条件

只是google将其翻译为快速通道。另一个有趣的事情是我的异常消息是用丹麦语打印的 - &gt;只有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());
        ...
    }
    ...
}

编辑2 @zloster我不会说它与您链接的帖子完全相同。因为他们的问题是将列表绑定到查询,所以我的解决方案工作正常。我的问题是我无法弄清楚为什么我不能在我的查询上做一个简单的低操作,例如WHERE 1&lt;我没有意识到&lt;是StringTemplate的保留字符。但是,你给的链接有我的问题的解决方案“......括号&lt;喜欢这个\&lt; ...”,但我不同意说它自己的问题是重复的。

所以他们的问题是“如何将列表绑定到SQL查询的IN语句?”

我的问题是“为什么比较运算符在JDBI sql中不起作用”

当然是因为我使用注释@UseStringTemplate3StatementLocator来使我的列表映射到IN语句。我工作过,但他们没有。但我不能让我的工作低于或高于任何类型的工作。

1 个答案:

答案 0 :(得分:0)

我找到了我的查询问题的解决方案,在JDBI上搜索另一个主题我偶然发现了post 我特别注意到这句话

  

另请注意,使用此注释时,您无法使用&#39;&lt;&#39; SQL查询中的字符没有转义(因为它是StringTemplate使用的特殊符号)。

我在界面中使用了注释@UseStringTemplate3StatementLocator,我对其进行了测试,并且当gt, lt, gte, lte运算符与\\进行转义时,它与<, >, <=, >=运算符一起使用。因此,如果有人使用相同的注释并且遇到与我相同的问题,那么如果您使用这些查询运算符{{1}},这将解决问题。