代码之家  ›  专栏  ›  技术社区  ›  Gavrilo Adamovic

在spring和HQL中实现搜索功能

  •  0
  • Gavrilo Adamovic  · 技术社区  · 8 年前

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

       @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);
    

    我不知道我能不能用 concat

    编辑

    我试过把 % 从查询中得到的信号和它的工作。看来我得把它们放对,但我不知道怎么放。

    这起作用了:

    @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);
    

    问题只是如何使用 % .

    1 回复  |  直到 8 年前
        1
  •  1
  •   GPI    8 年前

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

    lower(e.email) like lower('%'+':email'+'%')")
    

    HQL specification

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

    不管怎样,为了达到同样的效果,以一种可以预见的方式,我建议你重写

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

    我觉得这并不含糊。