Имеется метод в ДАО слое. В методе составляется запрос с помощь
CriteriaBuilder
. В данный метод в качестве аргумента приходит
Map<ColumnName, SqlSortOperator> params
:
@Override
public Set<GiftCertificate> findAllOrderBy(Map<ColumnName, SqlSortOperator> params) {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<GiftCertificate> cq = cb.createQuery(GiftCertificate.class);
Root<GiftCertificate> from = cq.from(GiftCertificate.class);
// work with Stream....
}
Сделал работу с
Map
следующим образом:
Set<Order> orders = new HashSet<>();
for(Map.Entry<ColumnName, SqlSortOperator> entry : params.entrySet()) {
String field = entry.getKey().name().toLowerCase();
Path<String> path = from.get(field);
SqlSortOperator sqlSortOperator = entry.getValue();
Order order = sqlSortOperator.equals(SqlSortOperator.ASC) ? cb.asc(path) : cb.desc(path);
orderSet.add(order);
}
Выглядит громоздко, решил переписать с использованием
Stream
, но столкнулся с моментом - Как в Stream получить объект из предыдущего шага:
Set<Order> orders = params.entrySet().stream()
.map(Map.Entry::getKey)
.map(Enum::name)
.map(String::toLowerCase) // String columnName = "name"
.map(from::get) // Path<String> path = from.get(columnName);
.map() // Как выполнить SqlSortOperator sqlSortOperator = entry.getValue();
.map() // Order order = sqlSortOperator.equals(SqlSortOperator.ASC) ? cb.asc(path) : cb.desc(path);
.collect(Collectors.toSet());