【问题标题】:JPQL LIKE syntax with Strings带有字符串的 JPQL LIKE 语法
【发布时间】:2014-04-20 23:38:20
【问题描述】:

编辑:

我将硬编码查询更改为:

 query.setParameter("desc", "%unplug //your// server... enjoy the freedom%" ESCAPE '//')

现在我收到了com.sun.jdi.InvocationException occurred invoking method.


也没有产生堆栈跟踪。




我的 PostgreSQL 数据库中有一个描述列,我正在尝试使用“LIKE”子句对其进行查询,但是我无法获得任何结果。这是一个例子:

    Query query = em.createQuery("from MyClass c WHERE c.description LIKE :desc");
    query.setParameter("desc", "%unplug /your/ server... enjoy the freedom%"); 

在数据库中,我有许多包含上述文本子字符串的描述。我做了很多研究并研究了转义特殊字符等,但没有任何效果。

我错过了一些东西,我无法弄清楚那是什么。

【问题讨论】:

  • 你的描述真的包含“/your/”吗?当你改用%e% 时发生了什么?
  • 是的,确实如此。它是带有一些不寻常标记的抓取文本。当你问我是否尝试过 %e% 时,你的意思是字面意思“%e%”还是转义序列 %E
  • 不,我的意思是字面意思%e%。我确定你有一个数学描述 %e%。我不太确定你有一个匹配你的长参数。如果查询与%e% 一起使用,则表示您的参数错误。如果它不适用于%e%,那么您将不得不在其他地方寻找原因。
  • 当我重新开始工作时会玩它。感谢您的建议
  • 你得到了什么异常似乎 select c from MyClass c 是查询的正确开始

标签: java sql postgresql jpa jpql


【解决方案1】:

很可能斜线 / 搞乱了 PG 中的解析。将参数转换为带引号的文字。除非您确定没有特殊字符进入字符串参数(即您控制字符串),否则这始终是避免 SQL 注入的好主意。

query.setParameter("desc", "quote_literal('%unplug /your/ server... enjoy the freedom%')");

【讨论】:

  • 谢谢@Patrick;我明天试试。我希望 JPA 有这样的东西,这样我们就不必进入数据库特定的功能来使其工作。
  • 很抱歉听到这个消息。您是否尝试过 JB Nizet 使用简单字符串进行匹配的方法?
  • Patrick,我已经尝试过他的方法并且它有效。似乎是特殊的字符让一切都崩溃了
  • 特伦分部分试。尝试诸如“server...”、“/your/”之类的东西。第一个应该可以工作,第二个我不太确定。如果您可以在那里找到任何错误条目,还请查看 postgresql 日志。一个完全不同的解决方案是使用文本搜索扩展:查看文档的第 9.13 节。
  • 原来是我的 toString() 方法导致了循环依赖。我修复了该方法并添加了 em.delete();我的 DAO 中的 em.flush() 并且所有工作都按预期工作。感谢大家的意见
猜你喜欢
  • 2021-11-27
  • 1970-01-01
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
  • 2017-02-15
  • 2014-08-17
  • 1970-01-01
  • 2015-04-12
相关资源
最近更新 更多