【问题标题】:JPA OR condition with single value具有单个值的 JPA OR 条件
【发布时间】:2016-08-21 23:44:18
【问题描述】:

我有一家餐桌公司:companyId numbercompanyName varcharaddress nvarchar。 我想实现一个目标,用户可以使用 id 或公司名称查询以获取公司,图像有一个搜索框,用户只需输入一个值,然后它将获取公司信息。

我写了一个仓库

@Query(value = "select c from CompanyBasicInfo c where c.companyID = ?1 or c.companyName = ?1 ")
List<CompanyBasicInfo> findByCompanyIDOrCompanyName(@PathVariable String input);

但是当我查询时,我得到一个错误:Parameter value [10083769] did not match expected type [java.lang.Long (n/a)]

我该如何解决这个问题?大多数可用的材料都类似于 findByFirstnameOrLastname 使用两个值。非常感谢!

【问题讨论】:

  • 如果是 idcompany name,为什么不将方法调用包装在 if-statement 中,检查 Search-Param ( String) 仅由数字组成? :o
  • @PathVariable 看起来很奇怪。问题是因为公司 ID 是长的,你不能用字符串“?1”“=”它。您可能会使用select c from CompanyBasicInfo c where CAST(c.companyID AS String)= ?1 or c.companyName = ?1
  • @RC 这可行,但不鼓励使用,因为在搜索条件上使用分析函数效率低下。
  • @ArnaudDenoyelle 这就是为什么我说“闯入”:)
  • @Seth,我们为前端提供服务,所以你说的逻辑可以在那里完成,但提供一个服务并让前端只调用服务有点酷,而且简单的。 :)

标签: java hibernate spring-data-jpa jpql


【解决方案1】:

如果没有一家公司的名称仅由数字组成,您可以创建 2 个方法(按 companyId / 按公司名称)并检查您输入的是否是数字。

如果你不想这样做,你可以使用“2 params”版本:

List<CompanyBasicInfo> findByCompanyIDOrCompanyName(Long companyId, String companyName);

然后解析你的输入:

List<CompanyBasicInfo> find(String input) {
  Long companyId = null;
  try {
    companyId = Long.valueOf(input);
  } catch(Exception ignored){}

  return repository.findByCompanyIDOrCompanyName(companyId, input);
}

【讨论】:

    【解决方案2】:

    这不是参数数量的问题,而是参数类型的问题

    您可以尝试使用 cast 函数在查询中将 companyId 视为字符串,如下所示。 How do I write hql query with cast?

    你的代码看起来像

    @Query(value = "select c from CompanyBasicInfo c where cast(c.companyID as String) = ?1 or c.companyName = ?1 ")
    List<CompanyBasicInfo> findByCompanyIDOrCompanyName(@PathVariable String input);
    

    【讨论】:

    • 包含有帮助的代码而不是仅仅链接到另一个类似的答案会很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 2020-05-22
    • 2017-03-10
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多