gpt4 book ai didi

java - 在 Spring 和 HQL 中实现搜索功能

转载 作者:行者123 更新时间:2023-12-02 10:52:36 26 4
gpt4 key购买 nike

我正在我的 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);

问题只是如何使用%

最佳答案

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

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

来自HQL specification ,我知道“+”号可以作为算术运算符,但我不确定它是否可以用于任何其他用途。

显然,你的陈述“意味着某些东西”,因为 Hibernate 不会将其报告为语法错误,但我不知道它的真正含义,因为我们不在算术上下文中。也许它连接字符串但不替换占位符?让 Hibernate 激活 showSQL 并记录它,或者查看查询对象的编译版本来内省(introspection)它会很有趣,但我现在没有时间这样做。

无论如何,为了以可预测的方式达到相同的结果,我建议您重写为

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

我认为这没有歧义。

关于java - 在 Spring 和 HQL 中实现搜索功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52053736/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com