【问题标题】:JAVA: NamedQuery String problemJAVA:命名查询字符串问题
【发布时间】:2011-03-30 11:49:11
【问题描述】:

大家好,我在执行 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 "'")

但是,如果字符串中包含单引号,它会破坏我的代码...

各位有什么想法吗?

【问题讨论】:

    标签: java jpa jpql named-query


    【解决方案1】:

    我在 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
    }
    

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

    数据库条目:名称 = "Flavio" - 用函数 = "Flavio" 修剪。

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

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

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

    感谢所有其他答案!

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 嗨 axtavt,感谢您的快速回答!好吧,我的数据库设置为 VARCHAR。但是我不确定MySql版本是否与这个问题有关。我还考虑在设置查询参数之前进行一些调整,但是我希望软件针对与数据库不同的任何内容返回错误,以确保用户输入的正是他想要的。
      • @flavio:我对 MySQL 不熟悉,所以不能说它的特性。另请注意,我的查询示例会修剪存储的值,而不是参数,因此结果应该是准确的。
      • 我调试了检查构建查询过程的代码...使用您提供的代码,看起来问题出在 mySql 中。我注意到参数和数据库条目都不同......但是对于一些未知的神秘神力 MySql 只是修剪空格并认为它完全匹配......现在我想我需要做一些研究来看看这是否是真的是 MySql 预期的行为,或者背后还有其他东西。至于现在,我想我将不得不做一些额外的检查。谢谢!
      猜你喜欢
      • 2013-05-28
      • 2012-09-21
      • 2011-09-04
      • 2011-12-05
      • 2019-05-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      相关资源
      最近更新 更多