我正在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);
问题仅在于如何使用%
。
答案 0 :(得分:1)
问题可能是HQL以不符合您需求的方式解释了查询的这一部分:
lower(e.email) like lower('%'+':email'+'%')")
从HQL specification,我知道“ +”号可以用作算术运算符,但是我不确定在任何其他用途中都允许使用该符号。
很明显,您的语句“意味着某事”,因为Hibernate不会将其报告为语法错误,但是看到我们不在算术上下文中,我不知所措。也许它连接字符串但不替换占位符?让Hibernate激活showSQL并记录它,或者查看查询对象的编译版本以进行自省,这很有趣,但是我现在没有时间这样做。
无论如何,为了获得相同的结果,以可预测的方式,我建议您重写为
mail like concat('%', lower(:email), '%')
我觉得很明确。