Есть такой запрос в базу:
select g.name, a.name, a.value from keycloak_group g
left join group_attribute a on g.id = a.group_id
order by a.value;
Который сортирует результат по строковому полю group_attribute.value. Сортировка по сроке имеет свои кривоватости, от которых нужно избавиться, корректный SQL будет таким:
select g.name, a.name, (btrim(value, 'Code-'))::integer as value from keycloak_group g
left join group_attribute a on g.id = a.group_id
order by a.value;
Т.е. убираем из строки буквы, а потом оставшееся число конвертируем в integer и сортируем по нему.
На уровне кода изначальный запрос выглядит так:
// Базовый join к таблице group_attribute
Join<GroupEntity, GroupAttributeEntity> attributesJoin = group.join("attributes", JoinType.LEFT);
Predicate joinCondition = cb.equal(attributesJoin.get("name"), sort);
attributesJoin.on(joinCondition);
query.groupBy(group.get("id"), attributesJoin.get("value"));
Expression<String> sortedValue = cb.coalesce(attributesJoin.get("value"), "");
if (isDesc) {
query.orderBy(cb.desc(sortedValue));
} else {
query.orderBy(cb.asc(sortedValue));
}
В джаву только погружаюсь (до этого работал только с php/go), и я вообще не понимаю как через джавовский queryBuilder можно реализовать нужные изменения, а именно добавить в select свое поле, и использовать в качестве сортировки его.
В качестве ORM используется jakarta.persistence.