大家好,我在做名字时的精确匹配方面遇到了一些问题。

我目前正在使用类似的东西:

@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());

它在大多数情况下都可以使用,但是我注意到,如果用户将文件名传递给末端的空间,则命名Query忽略该字符。例如:

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

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

我能想到的一个解决方法是将围绕我的参数的单引号放在命名的Querquery中,这样:

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

但是,如果字符串中包含单个引号,它将丢弃我的代码...

有什么想法吗?

有帮助吗?

解决方案 2

我在JPA进行了一些研究,发现它可以自动修剪炭,我不确定这是否与字符串相同,但是由于它发生在我身上...我相信。绕过它的唯一方法是在会话databaselogin对象中设置一些属性(请参阅 http://www.eclipse.org/eclipselink/api/1.1/org/eclipse/persistence/sessions/databaselogin.html#setshouldtrimstrings) .

好吧,我不想弄乱会话属性,所以我决定进行某种检查并抛出与NoreSultException Catch在我的代码中相同的例外。

我基本上从数据库中获取了结果,并将字段与我使用的字符串进行了比较:

query.setParameter(Entry.NAME, myEntry.getName());

...

if(!StringUtils.equals(result.getName(), myEntry.getName()){
   do a cool throw just like NoResultException Catch
}

我还必须包括装饰函数axtavt!这只是为了确保数据库具有带有尾间空间的列,并且与用户给出的参数匹配,则将其作为有效答案包含。例如:

数据库条目:名称=“ flavio” - 用功能=“ flavio”修剪。

传递的参数:名称=“ Flavio” - 由JPA自动函数修剪=“ Flavio”。

如果根本不修剪它,它只会将“ Flavio”与“ Flavio”进行比较,当应该返回该条目时,将返回Noresult。

令人讨厌的解决方法,但是只要没有其他方法可以停止自动修剪,我们将不得不只利用这种事情。

感谢所有其他答案!

其他提示

我想这是因为您的数据库字段被声明为 CHAR(...), ,因此,存储的值用白色空间填充 = 手术。

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

query = "select e from Entry e where trim(trailing from e.name) =:"+ Entry.NAME
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top