【发布时间】: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, ''))