当前位置: 首页 > 知识库问答 >
问题:

Spring JPA中带有显式空支持的查询方法中的可选参数

闾丘淇
2023-03-14

正如这个答案所示,我想忽略过滤器中未指定的字段,但我还想找到一种方法来显式指定字段是否为空。

基本上是这样的:

class User {
    String f1;
    String f2;
    String f2;
}

class UserFilter {
    Optional<String> f1;
    Optional<String> f2;
    Optional<String> f3;
}

class UserService {
    List<User> findBy(UserFilter u){
        userRepository.findAll(Example.of(user));
    }
}

如果可选

e、 g如果f1f3不为空,且f2为空,则应通过f1f3查找并忽略f2的值,但如果f2的值不为空,则应返回数据库中f2为空的实体。


共有1个答案

司徒高寒
2023-03-14

首先,您需要在ExampleMatcher中包含null字段,因为默认匹配器不包含它。

其次,如果可选为null,则需要排除此字段。

简而言之,您可以编写这样的方法:

public static Example<User> getExampleByUserFilter(UserFilter userFilter) {

    User user = new User();
    ExampleMatcher exampleMatcher = ExampleMatcher.matchingAll()
            .withIgnorePaths("id") // (1)
            .withIncludeNullValues();

    Optional<String> optionalF1 = userFilter.getF1();
    if (optionalF1.isPresent()) {
        if (!optionalF1.get().isBlank()) {
            user.setF1(optionalF1.get());
        }
    } else {
        exampleMatcher = exampleMatcher.withIgnorePaths("f1");
    }

    Optional<String> optionalF2 = userFilter.getF2();
    if (optionalF2.isPresent()) {
        if (!optionalF2.get().isBlank()) {
            user.setF2(optionalF2.get());
        }
    } else {
        exampleMatcher = exampleMatcher.withIgnorePaths("f2");
    }

    // other fields ..

    return Example.of(user, exampleMatcher);
}

让我们举个例子,看看sql查询输出:

...

UserFilter userFilter1 = new UserFilter(
        Optional.of("f1"),
        Optional.empty(),
        Optional.of("f3"));

UserFilter userFilter2 = new UserFilter(
        Optional.of("f1"),
        Optional.of(""),
        Optional.of("f3"));

userRepository
        .findAll(getExampleByUserFilter(userFilter1));
userRepository
        .findAll(getExampleByUserFilter(userFilter2));
...

本例的控制台输出:

Hibernate: select ... from user user0_ 
    where user0_.f1=? and user0_.f3=?
Hibernate: select ... from user user0_ 
    where user0_.f1=? and user0_.f3=? and (user0_.f2 is null)

(1) 这里重要的一点是,您需要删除所有不在过滤器中使用WithinorePath(…)的字段 在第一步中。

<代码>或

我建议对此类条件操作使用规范和Querydsl

您也可以从JpaSpecificationExecitor扩展并从示例中获取带有QueryByexample plePredicateBuilder谓词

 类似资料:
  • 问题内容: 使用Hibernate时,有什么方法可以在命名查询中指定可选参数(例如,从表单提供搜索参数而并非所有参数都是必需的)?我正在使用本机SQL查询,但该问题可能也适用于命名HQL查询。 我很确定对此的答案是“否”,但是我还没有在文档中找到确切的答案。 问题答案: AFAIK,没有这样的事情,因此您必须为此编写一个动态查询。也许看一下以前的答案,该答案显示了如何在HQL中执行此操作(您可以将

  • 问题内容: 我想在存储库层中编写一些查询方法。此方法必须忽略空参数。例如: 在这种情况下,此方法必须返回Foo: 如果gooParam不为null。如果gooParam为null,则条件更改为: 有什么解决办法吗?有人能帮我吗? 问题答案: 来不及了。不确定 Bar 和 Goo 之间的关系。检查 Example是否 可以帮助您。 它为我工作。我有一个类似的情况,实体 用户 具有属性集,并且有基于属

  • 有什么解决办法吗?有人能帮帮我吗?

  • 在下面的代码中,我有时会将设置为null。此时,它抛出错误为“could not extract resultset;SQL[n/a];嵌套异常为org.hibernate.exception.sqlgrammarexception:could not extract resultset” 即使为空,我如何获取数据。总有一天约会就要来了。这是怎么做的? null

  • 我不明白 FastAPI 中的可选查询参数。它与默认值为 的默认查询参数有何不同? 在下面的示例中,arg1和arg2有什么区别?在该示例中,arg2是一个可选的查询参数,如上面的链接所述。

  • 问题内容: 我正在开发一个需要搜索功能的应用程序,我想编写根据参数动态创建的HQL查询。目前我有4个参数,而根据用户想要的搜索方式,所有参数都是必需的,或者1或2或3个参数是必需的。 这是我对所有4个参数的常规查询,现在我必须编写一个搜索查询,在其中使用多个可选参数,如何使用可选参数进行此查询?请将我的查询转换为动态可选参数查询?谢谢 问题答案: 我这样自己转换查询