JAVA:NamedQuery String问题

fla*_*ama 6 java jpa named-query jpql

大家好,我在做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());
Run Code Online (Sandbox Code Playgroud)

它适用于大多数情况,但是我注意到,如果用户在末尾传递带有空格的文件名,则namedQuery会忽略该字符.例如:

Query query = em.createNamedQuery(MyClass.GET_ENTRY_BY_NAME);
        query.setParameter(Entry.NAME, myEntry.getName()+ " ");
Run Code Online (Sandbox Code Playgroud)

将返回与之前的查询相同的结果.绕过我的"有效条目"验证.换句话说,我希望查询根本不返回任何条目,稍后再处理错误.

我能想到的一个解决方法是在namedQuery中放置我的参数的单引号,如下所示:

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

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

有什么想法吗?

fla*_*ama 4

我对 JPA 做了一些研究,发现它对 CHAR 进行了一些自动修剪,我不确定这与字符串的行为是否相同,但因为它发生在我身上......我相信是这样。绕过它的唯一方法是在会话 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
}
Run Code Online (Sandbox Code Playgroud)

我还必须包含修剪功能 axtavt!这只是为了确保如果数据库有一列带有尾随空格并且它与用户给出的参数匹配,则它将作为有效答案包含在内。例如:

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

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

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

这是令人讨厌的解决方法,但只要没有其他方法来停止自动修剪,我们就只能使用这类东西。

感谢所有其他答案!