我有一个使用JPA / Hibernate作为实体管理/建模的Spring Boot应用程序。我有以下用户类:
@Entity
public class User {
@Id
private Long Id;
private String name;
//more fields, getters and setters below
}
我希望我的应用程序的用户能够按名称搜索用户。所以在我的存储库界面中,我有:
public interface UserRepository extends JpaRepository<User, Long> {
@Query(value = "SELECT u from User u WHERE lower(u.name) LIKE lower(:name)")
List<User> findByNameLike(@Param(value="name") String nmae);
}
然后在我的UserController中,我有:
@GetMapping(value = "/users/")
public @ResponseBody List<User> search(@RequestParam String name) {
return this.userRepository.findByNameLike(name);
}
这总是返回一个空列表。我知道name参数正确进入。
此外,我知道它正在识别@Query
注释,因为如果我将查询更改为类似
SELECT u FROM User u
它将返回给我所有用户。或者,如果我将其更改为
SELECT u from User u WHERE u.name = '%Bob%'
并从方法中删除参数,它将返回名称为Bob的所有用户。我尝试了其他查询变体,例如
SELECT u FROM User u WHERE lower(u.name) LIKE CONCAT('%', lower(:name), '%')
SELECT u FROM User u WHERE u.name = :name (even a simple equals doesn't work)
依此类推。我看到的每个来源,我复制的语法似乎都说我正确地编写了查询,所以我认为其他一些事情必须继续下去。 我也试过让Spring使用
为我生成查询public List<User> findByNameLike(String name);
public List<User> findByNameContaining(String name);
它似乎也不起作用。任何帮助将在这里受到赞赏!