在 spring 和 HQL 中实现搜索功能
Implementing search functionality in spring and HQL
我正在 spring 启动应用程序中实施搜索。搜索词正在搜索名字、姓氏和电子邮件。在我的数据库中,我将姓名存储在两列中:名字和姓氏。我想要实现的是让用户输入全名(名字+姓氏)并搜索数据库。我试过了,但是当所有参数都为空时,这个查询 return 是我的空集,我希望它 return 所有用户。
@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);
问题只是如何使用%
。
问题可能是 HQL 以不适合您需要的方式解释这部分查询:
lower(e.email) like lower('%'+':email'+'%')")
根据 HQL specification,我知道“+”号可以用作算术运算符,但我不确定它是否可以用于任何其他用途。
显然,您的语句 "means something",因为 Hibernate 不会将其报告为语法错误,但我不知道它的含义,因为我们不在算术上下文中。也许它连接字符串但不替换占位符?让 Hibernate 激活 showSQL 并记录它,或者查看查询对象的编译版本来反省它会很有趣,但我现在没有时间这样做。
无论如何,为了以可预测的方式达到相同的结果,我建议您重写为
mail like concat('%', lower(:email), '%')
我觉得没有歧义。
我正在 spring 启动应用程序中实施搜索。搜索词正在搜索名字、姓氏和电子邮件。在我的数据库中,我将姓名存储在两列中:名字和姓氏。我想要实现的是让用户输入全名(名字+姓氏)并搜索数据库。我试过了,但是当所有参数都为空时,这个查询 return 是我的空集,我希望它 return 所有用户。
@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);
问题只是如何使用%
。
问题可能是 HQL 以不适合您需要的方式解释这部分查询:
lower(e.email) like lower('%'+':email'+'%')")
根据 HQL specification,我知道“+”号可以用作算术运算符,但我不确定它是否可以用于任何其他用途。
显然,您的语句 "means something",因为 Hibernate 不会将其报告为语法错误,但我不知道它的含义,因为我们不在算术上下文中。也许它连接字符串但不替换占位符?让 Hibernate 激活 showSQL 并记录它,或者查看查询对象的编译版本来反省它会很有趣,但我现在没有时间这样做。
无论如何,为了以可预测的方式达到相同的结果,我建议您重写为
mail like concat('%', lower(:email), '%')
我觉得没有歧义。