【问题标题】:Issues using % in hql query在 hql 查询中使用 % 的问题
【发布时间】:2016-12-13 13:59:55
【问题描述】:

我想通过登录搜索员工列表,我使用扩展JpaRepository的DAO接口:

public interface EmployeRepository  extends  JpaRepository<Employe, Long> {
    @Query("select e from Employe e where e.login like :x")
    public Page<Employe> employeeParLogin(@Param("x")String login, Pageable p);
}

在我的服务层,我调用这个方法

@Override
public Page<Employe> employeeParLogin(String login, Pageable p) {
    // TODO Auto-generated method stub
    return employeRepository.findByLogin("%"+login+"%", p);
}

当我用

测试它时
Page<Employe> pe = employeMetier.employeeParLogin("fe",new PageRequest(0,2));

虽然我有一个员工的登录名包含fe,但它没有返回任何内容。

P.S.:只有在服务层的方法中去掉参数login的两个%,我写整个login才可以正常工作。

【问题讨论】:

  • 您可以检查此Spring JPA @Query with LIKE,因为此 QA 提供了两种方法,您可以使用 CONCAT 函数,也可以使用 双管道

标签: java spring repository hql spring-data-jpa


【解决方案1】:

您可以检查此Spring JPA @Query with LIKE,因为此 QA 提供了两种方式,您可以使用 CONCAT 函数,也可以使用双管道。

所以你的 EmployeRepository 界面将是这样的:

   public interface EmployeRepository  extends  JpaRepository<Employe, Long> {
      // you can use concat function like : CONCAT('%',:x,'%') or double pipe || 
      @Query("select e from Employe e where e.login like '%'||:x||'%'")
      public Page<Employe> employeeParLogin(@Param("x")String login, Pageable p);
   }

对于您的服务层,它将是:

@Override
public Page<Employe> employeeParLogin(String login, Pageable p) {
    // TODO Auto-generated method stub
    return employeRepository.findByLogin(login, p);
}

否则,如果这些都不起作用,您可以删除@Query 行并将您的方法employeeParLogin 重命名为findByLoginContaining,因此它将是:

public Page&lt;Employe&gt; findByLoginContaining(String login, Pageable p);

希望对你有所帮助。

【讨论】:

  • 感谢您的回复。我已经尝试过这个解决方案,但它只有在我输入整个登录参数而不是它的一部分时才有效。我不明白你说的双管是什么意思??
  • 从提供的QA来看,有一个例子:@Query("select e from Employe e where e.login like '%'|| :x || '%'") public Page&lt;Employe&gt; employeeParLogin(@Param("x")String login, Pageable p);,在employeRepository.findByLogin方法中不需要使用"%"+login+"%"
  • 仍然是同样的问题。它仅适用于整个登录:(
  • 好的,我所做的只是我已经以这种方式更改了存储库方法中的查询 @Query("select e from Employe e where e.login like '%'|| :x || ' %'") 并且我从服务层的方法中删除了'%'。当我测试它时,它仅在参数 login=imene 时起作用,例如我的数据库中已经有一个 login=imene 但不适用于 i im 或 imen。我希望我已经解释清楚了:)
  • 请检查我的更新,因为您可以使用 CONCAT('%',:x,'%') 代替双管道
猜你喜欢
  • 2014-07-11
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多