Задать вопрос
@HellWalk

Как переделать этот SQL запрос на java?

Есть такой запрос в базу:
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.
  • Вопрос задан
  • 258 просмотров
Подписаться 1 Простой 2 комментария
Помогут разобраться в теме Все курсы
  • Нетология
    Java-разработчик с нуля
    12 месяцев
    Далее
  • Яндекс Практикум
    Java-разработчик
    10 месяцев
    Далее
  • Яндекс Практикум
    Java-разработчик плюс
    14 месяцев
    Далее
Решения вопроса 1
@HellWalk Автор вопроса
Чатжпт на удивление понял проблему и дал рабочее решение:

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"));

// btrim(value, 'Code-')
Expression<String> trimmed =
        cb.function("btrim", String.class,
                attributesJoin.get("value"),
                cb.literal("Code-"));

// cast to integer
Expression<Integer> sortedValue =
        cb.coalesce(trimmed.as(Integer.class), 0);

if (isDesc) {
    query.orderBy(cb.desc(sortedValue));
} else {
    query.orderBy(cb.asc(sortedValue));
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы