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
作为参数能够将任何要执行的方法传递给该方法:
@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);
}
In 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 客户端类进行了更复杂的单元测试。