Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate:按名称搜索用户,无论firstname/lastname的顺序如何_Hibernate_Search - Fatal编程技术网

Hibernate:按名称搜索用户,无论firstname/lastname的顺序如何

Hibernate:按名称搜索用户,无论firstname/lastname的顺序如何,hibernate,search,Hibernate,Search,我有这个(简化的)表User,绑定到一个POJOUser.java,这要感谢Hibernate: +---+------------+-------------+ | | firstName | lastName | +---+------------+-------------+ | 1 | John | Doe | | 2 | John | Poe | +---+------------+-------------+ 在我

我有这个(简化的)表
User
,绑定到一个POJO
User.java
,这要感谢Hibernate:

+---+------------+-------------+
|   | firstName  | lastName    |
+---+------------+-------------+
| 1 | John       | Doe         |
| 2 | John       | Poe         |
+---+------------+-------------+
在我的UI中,我有一个搜索字段来搜索用户,它建议与您键入的内容相关的结果。例如,如果我在此搜索字段中键入“
Jo
”,它会提示我两个结果:“
johndoe
”和“
johnpoe
”。这很有效

现在,我想让这个搜索字段向我推荐用户,无论我输入firstname和lastname的顺序如何。举例来说,如果我键入“
Doe Jo
”,它会提示我“
John Doe

以下是我使用的查询:

select u from User u
where lower(concat(u.lastName,' ',u.firstName)) like lower(:typedName)
or lower(concat(u.firstName,' ',u.lastName)) like lower(:typedName)
其中
typedName
是我在搜索字段中输入的文本。此参数包含在查询中,如下所示:

query.setParameter("typedName", typedName+'%');
  • 如果我键入“
    Jo
    ”、“
    John
    ”或“
    johnd
    ”或更多,它会找到好结果
  • 如果我键入“
    D
    ”或“
    Doe
    ”,如果我找到好结果
  • 如果我键入“
    Doe J
    ”或更多,则找不到结果
为什么最后的输入找不到任何结果?我的查询条件的第一部分应该能够处理这个问题,就像第二部分能够处理“
johnd
”一样,不是吗

编辑 如评论中所述,以下是我执行查询的方式:

final TypedQuery<User> query = getEntityManager()
    .createNamedQuery("my_query_name", User.class);
query.setParameter("typedName", typedName+'%');

try {
    return query.getResultList();
} catch (PersistenceException e) {
    e.printStackTrace(); // for debug purpose
}
final TypedQuery query=getEntityManager()
.createNamedQuery(“我的查询名称”,User.class);
setParameter(“typedName”,typedName+“%”);
试一试{
返回query.getResultList();
}捕获(持久异常e){
e、 printStackTrace();//用于调试目的
}
编辑2
还请注意,生成的SQL检索到上一个案例的良好结果

当您手动执行生成的SQL时,它是否起作用?只是猜测:您在数据库中的John Doe实际上是一个“John”“Doe”(结尾有一个额外的空格)?@DraganBozanovic:它与生成的SQL一起工作,我得到了预期的结果。生成的SQL如何检索良好的结果而Hibernate查询无法检索?@TobiasLiefke我进行了检查,并且没有为任何usersCheckout添加额外的空格。通常情况下,两次使用命名参数(如答案中所述)都不会有问题,但我认为使用两个参数名进行尝试是值得的。