gpt4 book ai didi

java - Spring 数据 JPA : how to return empty result when repository method parameter of Collection type is empty?

转载 作者:行者123 更新时间:2023-11-30 07:49:59 26 4
gpt4 key购买 nike

我正在使用 Spring Data JPA v1.10.2还有一个用例:

ClientDao.java:

List<Client> getClientsByUnitsIn(@NonNull Collection<Unit> units);

此方法生成如下所示的 SQL 查询:

SELECT * FROM clients WHERE units in (?1)

当我为存储库方法添加 @Query 注释时,有一个类似的情况:

@Query("SELECT c FROM Client c WHERE c.unit IN (?1)")
List<Client> getSpecificClients(@NonNull Collection<Unit> units)

但在很多情况下参数units可能为空。在这种情况下,该方法应该返回空结果,但它只是失败并显示一条关于错误的 SQL 语句的消息。

我使用了一个变通方法:像这样向存储库添加一个默认方法:

default List<Client> getSpecificClientsOrEmpty(@NonNull Collection<Unit> units){
if (units.isEmpty) {
return emptyList();
}
return getSpecificClients(units);
}

但我不喜欢这种解决方法:

  • 我必须为每个案例创建一个额外的方法
  • 我必须检查代码中是否只有默认方法在使用,因为没有编译时检查,如果我错过了一些使用,我会得到一个运行时异常。

有没有人有更好的解决方案?

最佳答案

1) 使用 getSpecificClients() 存储库实现中的样板代码编写您自己的查询:

public List<Client> getSpecificClients(@NonNull Collection<Unit> units){
if (units.isEmpty()) {
return emptyList();
}
return em.createQuery("SELECT c FROM Client c WHERE c.unit IN (?1)", Unit.class)
.setParameter(1, units)
.getResultList();
}

如果这种预处理在你的存储库中是一个不常见的需求,那么这种方式应该受到青睐。
这种方式有点冗长,但在少数情况下仍然可以接受。

2)用AOP横向制作。
在您需要的每个方法之前定义一个 Aspect 来执行此处理:

if (units.isEmpty) {
return emptyList();
}

请注意,只有在预处理要求足够频繁地出现时才应使用这种方式,因为它会增加应用程序的复杂性和一般设置。

3) 您可以在接受 Function 作为参数的基础接口(interface)存储库中创建通用默认方法,以便能够将要执行的任何方法传递给该方法:

@SuppressWarnings("unchecked")
default<T, U> List<U> selectWithIn(Collection<T> valueForInClause, Function<Collection<T>, List<U>> function) {
if (valueForInClause.isEmpty()) {
return new ArrayList<U>();
}
return function.apply(valueForInClause);
}

ClientDAO 类中,您仍然会有这个:

@Query("SELECT c FROM Client c WHERE c.unit IN (?1)")
List<Client> getSpecificClients(@NonNull Collection<Unit> units)

在 DAO 的客户端代码中,您可以通过这种方式调用 selectWithIn() 方法:

private ClientDAO clientDAO;
...
List<Unit> units = ...;
List<Client> clients = clientDAO.selectWithIn(units, (o) -> clientDAO.getSpecificClients(o));

它不是太冗长,它节省了一些代码行,但我真的不喜欢这种方式,因为它对 DAO 客户端类进行了一些更复杂的单元测试。

关于java - Spring 数据 JPA : how to return empty result when repository method parameter of Collection type is empty?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48071990/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com