【问题标题】:Hibernate Query Like Issue休眠查询类似问题
【发布时间】:2013-01-24 11:16:14
【问题描述】:

我目前正在创建一个用户定义的搜索,我的问题是当涉及到普通 sql(我在我的数据库中运行它)时它会返回一个结果,但是当涉及到 HQL 时它不会返回任何结果。

例子。我在 SQL 中做了这个查询。

SELECT * FROM USER_PROFILES WHERE FIRST_NAME LIKE '%somevalue existinDb%';

这会返回一个值,但是使用 HQL 查询对象

  String someValue = "somevalue existinDb"
    String temp_name = "%" +someValue + "%";
            System.out.println(temp_name);
            Query query =  sess().createQuery(
                    "from UserProfile where firstName  LIKE :temp_name").setParameter("temp_name",temp_name);

但是,HQL 查询对象不会呈现与 SQL 查询相同的结果。为什么会这样?

【问题讨论】:

  • 尝试在您正在形成的 temp_name 的开头和结尾添加单引号
  • @Renjith 试过还是不行。
  • 有异常吗?你的somevalue existinDb 怎么样?

标签: java sql hibernate hql sql-like


【解决方案1】:

试试这个:

sess().createQuery( "来自 UserProfile where firstName LIKE :temp_name").setParameter("temp_name",'%' + someValue + '%');

还有一个更简单的方法: String someValue = "somevalue existsinDb" 字符串 temp_name = "%" +someValue + "%"; 查询 query = session.createQuery(“来自 UserProfile where firstName LIKE ?” ); query.setString(0, temp_name);

【讨论】:

  • 不会让我的查询容易受到 SQL 注入的影响
  • 看不懂,怎么会导致SQL注入?
【解决方案2】:
String temp_name = "%'" +someValue + "'%";

会为你工作。我以前也有同样的问题。如果它不起作用,您应该使用%s。我认为在参数前面放一个% 是行不通的。

% 符号可用于定义模式前后的通配符(模式中缺少的字母)。因此,如果您将% 放在字符串的前面,则您正在寻找someValue 之前的一些缺失字符串。

【讨论】:

  • 所以你建议我不要放任何 % 吗?我确实尝试将 % 放在最后,但仍然没有结果
【解决方案3】:

您应该使用Hibernate Search 进行这样的查询:效率更高,匹配结果更好,从而使应用程序更加用户友好。

【讨论】:

    【解决方案4】:

    您必须使用"/%" 而不是"%"

    【讨论】:

    • 欢迎来到 SO!您能否详细说明为什么这个答案是正确的?即使您似乎不需要,解释也可能对 OP 或遇到相同问题的未来访问者非常有帮助。
    • 抱歉我打错了,应该是"\%"。 “%”是一个特殊字符,你必须使用“\%”让hibernate明白你想在你的查询中添加“%”。
    猜你喜欢
    • 1970-01-01
    • 2010-12-06
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多