大家好,我在执行NamedQuery时遇到一些完全匹配的问题。

我目前正在使用这样的东西:

@NamedQuery(name = MyClass.GET_ENTRY_BY_NAME, query = "select e from Entry e where e.name =:"+ Entry.NAME )

...

Query query = em.createNamedQuery(MyClass.GET_ENTRY_BY_NAME);
        query.setParameter(Entry.NAME, myEntry.getName());

它适用于大多数情况,但是我注意到,如果用户传递的文件名末尾带有空格,则namedQuery会忽略该字符。例如:
Query query = em.createNamedQuery(MyClass.GET_ENTRY_BY_NAME);
        query.setParameter(Entry.NAME, myEntry.getName()+ " ");

将返回与查询之前相同的结果。绕过我的“有效条目”验证。换句话说,我希望查询完全不返回任何条目,以后再处理该错误。

我能想到的一种解决方法是,在我的参数中将单引号放在namedQuery中,如下所示:
@NamedQuery(name = MyClass.GET_ENTRY_BY_NAME, query = "select e from entry e where e.name =':"+ Entry.NAME "'")

但是,如果字符串中包含单引号,它将浪费我的代码。

有想法吗?

最佳答案

我猜发生这种情况是因为您的数据库字段被声明为CHAR(...),因此存储的值会被=操作未考虑的空格填充。

因此,您可以将数据库字段声明为VARCHAR(...)或使用内置的trim函数:

query = "select e from Entry e where trim(trailing from e.name) =:"+ Entry.NAME

08-29 00:56