正如这个答案所示,我想忽略过滤器中未指定的字段,但我还想找到一种方法来显式指定字段是否为空。
基本上是这样的:
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如果
f1
和f3
不为空,且f2
为空,则应通过
f1
和f3
查找并忽略f2
的值,但如果f2
的值不为空,则应返回数据库中f2
为空的实体。
首先,您需要在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个参数的常规查询,现在我必须编写一个搜索查询,在其中使用多个可选参数,如何使用可选参数进行此查询?请将我的查询转换为动态可选参数查询?谢谢 问题答案: 我这样自己转换查询