我有这个(简化的)表User
,由于Hibernate绑定到POJO User.java
:
+---+------------+-------------+
| | firstName | lastName |
+---+------------+-------------+
| 1 | John | Doe |
| 2 | John | Poe |
+---+------------+-------------+
在我的界面中,我有一个搜索字段来搜索用户,这会显示与您输入的内容相关的结果。例如,如果我在此搜索字段中输入“Jo
”,则会向我显示2个结果:“John Doe
”和“John Poe
”。这很好用。
现在我希望这个搜索字段向我建议用户,不管我用来键入名字和姓氏的顺序。例如,如果我输入“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
”或“John D
”或更多,我会找到好结果D
”或“Doe
”,如果找到了好结果Doe J
”或更多未找到任何结果。为什么最后一个输入找不到任何结果?我的查询条件的第一部分应该能够处理这个,因为第二部分能够处理“John D
”,不是吗?
正如评论中所述,这是我执行查询的方式:
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
}
另请注意,生成的SQL会检索到最后一个案例的好结果