【问题标题】:Why isn't my SQL query returning any results in hibernate?为什么我的 SQL 查询没有在休眠中返回任何结果?
【发布时间】:2020-05-20 08:52:59
【问题描述】:

在我的 spring/hibernate 应用程序中,我使用以下查询来搜索用户以检查字符串变量 name 是否存在于他们的任何名称中:

    Query query = this.entityManager.createQuery("SELECT user FROM User user WHERE CONCAT(user.name, user.middleName, user.lastName) LIKE CONCAT('%',:name,'%') ").setParameter("name", name).setMaxResults(20);

这不会返回任何结果。但是,当我运行

SELECT * FROM [TestDatabase].[dbo].User WHERE CONCAT(User.name, User.middleName, User.lastName) LIKE CONCAT('%','a','%')

在 MS SQL 服务器中,我获取名称中包含“a”的所有用户。

发生了什么事?

【问题讨论】:

  • 您可以启用休眠日志以查看生成的 sql-query 和参数并将它们与您的查询进行比较。见文档:docs.jboss.org/hibernate/orm/5.4/userguide/html_single/…
  • 我检查了休眠日志,似乎休眠正在将 CONCAT(User.name, User.middleName, User.lastName) 转换为 (user.name+user.middleName+ user.lastName)也不返回 MSSQL 中的任何行。为什么要这样做?
  • 我可以回答你为什么,但这对你没有帮助 - 它是在 org.hibernate.dialect.AbstractTransactSQLDialect 中配置的 this.registerFunction("concat", new VarArgsSQLFunction(StandardBasicTypes.STRING, "(", "+", ")")); 行。我在 sql 中尝试了 concat 和 + - 给了我相同的结果。也许不同的列类型有问题?也许您可以添加创建表的相关部分和一些测试数据?
  • 所以我发现 (user.name+user.middleName+ user.lastName) 不起作用,因为所有用户的 middleName 列都为空.. 并且空字符串没有被转换为 '' , 一个空字符串。我猜 CONCAT 在 + 运算符不考虑的地方考虑了 null 值
  • 好的,您可以在您的 JPQL 中尝试 isnull。 CONCAT(isnull(User.name, ''), isnull(User.middleName, ''), isnull(User.lastName, ''))

标签: sql spring hibernate


【解决方案1】:

按照 Tom 的建议,通过检查休眠日志,我发现休眠将 CONCAT(string, string) 转换为 string+string,这应该是相同的,但在我的情况下不起作用,因为其中一个字符串列是 NULL .

我最终的解决方案是将查询更改为

(user.name + ISNULL(user.middleName, '') + user.lastName)

【讨论】:

    【解决方案2】:

    在 HQl 和 SQL 查询中,我们不能像这样传递值 (:name),因为它在运行时取值。如果您想在运行时传递值,那么您应该尝试 Criteria,它肯定会起作用。

    【讨论】:

    • 这不是真的。
    猜你喜欢
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多