Java 在spring和HQL中实现搜索功能

Java 在spring和HQL中实现搜索功能,java,spring,hibernate,hql,Java,Spring,Hibernate,Hql,我正在我的spring boot应用程序中实现搜索。搜索词是通过名字、姓氏和电子邮件进行搜索。在我的数据库中,我将名字存储在两列中:名字和姓氏。我想要实现的是让用户输入全名first name+last name并搜索数据库。我尝试了这个方法,但当所有参数都为空时,这个查询将返回空集,我希望它返回所有用户 @Query("FROM Employee e WHERE " + "lower(concat(e.firstName,' ',e.lastName)) like

我正在我的spring boot应用程序中实现搜索。搜索词是通过名字、姓氏和电子邮件进行搜索。在我的数据库中,我将名字存储在两列中:名字和姓氏。我想要实现的是让用户输入全名first name+last name并搜索数据库。我尝试了这个方法,但当所有参数都为空时,这个查询将返回空集,我希望它返回所有用户

   @Query("FROM Employee e WHERE "
            + "lower(concat(e.firstName,' ',e.lastName)) like lower('%'+':fullName'+'%') AND "
            + "lower(e.email) like lower('%'+':email'+'%')")
    public Page<Employee> search(@Param(value = "fullName") String fullName,
                                 @Param(value = "email") String email,
                                                         Pageable page);

问题只是如何使用%。

问题可能是HQL对查询这一部分的解释方式不适合您的需要:

lower(e.email) like lower('%'+':email'+'%')")
从中,我知道+号可以用作算术运算符,但我不确定它是否可以用于任何其他用途

显然,您的语句有某种意义,因为Hibernate不会将其报告为语法错误,但我不知道它的真正含义,因为我们不在算术上下文中。可能它连接字符串,但不替换占位符?让Hibernate激活showSQL并将其记录下来,或者查看查询对象的编译版本以对其进行反思,这将是一件有趣的事情,但我现在没有时间这么做

无论如何,为了达到同样的效果,以一种可预测的方式,我建议你重写

mail like concat('%', lower(:email), '%')

我发现这一点并不含糊。

未经测试,但如果删除“e.firstName”和“e.lastName”中的单引号,就可以了,因为HQL支持concat@msparer试过了,还是没什么。@msparer另一个问题是我在参数名上加了引号:“email”,现在我在日志中得到了问号,而不是问号,这是正确的。我刚刚尝试过不带“%”符号的方法,效果很好。我只需要正确地放置“%”。我已经编辑了这个问题,所以如果你们有猜测,请告诉我。谢谢。我记得,只有在做算术运算时,where子句中才允许使用+。我猜您的HQL查询字符串“%”+“:email”。。。是否有效Hibernate接受它,但可能不做任何可以理解的事情。我会尝试重写为邮件,如concat“%”,下:email“%”。或者,更可能的情况是,在HQL查询之前从java端处理“%”。@GPI非常感谢,就这样。如果你想的话,就贴一个答案。
mail like concat('%', lower(:email), '%')