当前位置: 首页 > 面试题库 >

Spring数据JPA和参数可以为空

郑向阳
2023-03-14
问题内容

我的理解是,对于Spring数据JPA,我无法使用查询方法来获取列等于给定非空方法参数的所有行,而当方法参数为null时,无法使用相同的方法来获取此列为NULL的所有行。

那是对的吗?

因此,我必须在我的JAVA代码中对此进行区分,并且必须使用单独的查询方法明确要求空值,如下面的示例所示?

// Query methods
List<Something> findByParameter(Parameter parameter);
List<Something> findByParameterIsNull();

...

List<Something> result = new ArrayList<>();

if (parameter == null)
  result = findByParameterIsNull();
else
  result = findByParameter(parameter);

不好的是,如果我有4个可以为null的参数,并且必须编写16种不同的查询方法。


问题答案:

你是对的。

已提出支持更好地处理空参数的请求。
https://jira.spring.io/browse/DATAJPA-121

在您的情况下,我建议您编写存储库实现并使用自定义的CriteriaQuery处理您的情况。

您也可以将@Query注释与is
null
语法一起使用:

@Query("[...] where :parameter is null"
public List<Something> getSomethingWithNullParameter();

编辑

从Spring data jpa 2.0开始,spring现在支持@Nullable注释。这有助于处理传递的空参数。

从文档中:

@Nullable –用于可以为空的参数或返回值。



 类似资料:
  • 我的理解是,对于Spring数据JPA,我不能用一个查询方法来获取列等于给定的非空方法参数的所有行,也不能用相同的方法来获取方法参数为空时该列为空的所有行。 那是正确的吗? 所以我必须在我的JAVA代码中区分这一点,我必须使用一个单独的查询方法显式地请求空值,就像下面的例子一样? 这很糟糕,如果我有4个可能为空的参数,并且必须编码16种不同的查询方法。

  • 问题内容: 我正在使用Spring Data JPA,当我用来定义一个 WITHOUT 的查询时,它可以工作: 但是,如果我添加第二个参数,则将无法正常工作,Spring将解析该方法的名称,然后抛出 异常 。这是错误吗? 问题答案: 在Spring论坛上提出了一个类似的问题,指出要应用分页,必须派生第二个子查询。因为子查询引用的是相同的字段,所以您需要确保查询对引用的实体/表使用别名。这意味着您在

  • 我是Spring data JPA的新手,正在尝试了解如何最好地将其与QueryDSL一起使用。如果没有QueryDSL,我就可以用@Query注释在SpringData接口中创建任何查询。 为了获得使用QueryDSL的相同体验,根据我所看到的,我需要创建我自己的自定义存储库实现并让我的repo接口扩展我的自定义实现接口,或者将我的所有QueryDSL查询放在包装我的repo的服务层。 在第一种

  • 我有一个简单的JpaRepository和一个finder,它返回按名为“number”的属性降序排列的记录。“number”属性也是我的实体的@Id。这很好,但是有数千条记录,所以我想返回一个页面而不是列表。 如果我将查找器更改为以下内容,则排序不再起作用。我尝试过使用可分页参数的排序功能,但不起作用。还删除了OrderByNumberDesc,但结果相同。 EDIT-添加控制器方法 以下是我的

  • 在我的@Repository接口中,我使用包含参数(addressType)的JPQL@Query创建了自定义查找方法。 在该方法中,我没有在参数上指定@Param(“addressType”)。所以我要 java.lang.IllegalArgumentException:参数绑定的名称不能为空或空!对于命名参数,您需要使用@Param查询Java版本上的方法参数 好的,这很清楚,但是我用的是J

  • 我使用Spring Data JPA进行如下原生查询 现在,我的用例是 如果可用,则只应返回该类别中具有该代码的项目 但如果不可用,则应返回该类别中的所有项目 因此,上述类别的问题是当作为传递时,不会返回任何数据,因为它与任何内容都不匹配。尽管要求很高,但它应该被忽略。 那么,有没有一种方法可以选择性地向Spring数据JPA本机查询添加一个子句呢。我知道使用是可能的,但是我们能为原生查询做类似的