Arhn - архитектура программирования

Запрос Hibernate с атрибутом, аннотированным @Formula, в порядке по предложению

У меня есть 2 сущности:

@Entity
class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Set<Contract> contracts= new HashSet<>();

    @Formula("(select count(m.ORDER_ID) from myschema.ORDER_CONTRACTS m where m.ORDER_ID = id)")
    private Integer numberOfContracts;  // this is basically contracts.size()
}

а также

@Entity
class Contract {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String client;
    // some other properties
}

Когда я хочу, чтобы мои заказы были заказаны numberOfContracts, hibernate генерирует для меня этот запрос

SELECT order0_.id AS id1
com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-206, SQLSTATE=42703, SQLERRMC=ORDER0_.ID, DRIVER=4.27.25
, (SELECT COUNT(m.ORDER_ID) FROM myschema.ORDER_CONTRACTS m WHERE m.ORDER_ID = order0_.id) AS formula1_ FROM myschema.order order0_ ORDER BY (SELECT COUNT(m.ORDER_ID) FROM myschema.ORDER_CONTRACTS m WHERE m.ORDER_ID = order0_.id) DESC

и терпит неудачу с

com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-206, SQLSTATE=42703, SQLERRMC=ORDER0_.ID, DRIVER=4.27.25

Когда я заменяю выбор в ORDER BY на formula1_ следующим образом:

SELECT order0_.id AS id1_5_,
    (SELECT COUNT(m.ORDER_ID)
        FROM myschema.ORDER_CONTRACTS m
        WHERE m.ORDER_ID = order0_.id) AS formula1_
FROM myschema.order order0_
ORDER BY formula1_ DESC

Я получаю ожидаемый результат.

Есть ли способ указать hibernate использовать сгенерированный псевдоним (formula1_) вместо репликации формулы в порядке?

ИЗМЕНИТЬ:

Как получить запрос
Я использую org.springframework.web.bind.annotation.RestController. Этот контроллер предлагает конечную точку для получения всех Orders следующим методом:

@GetMapping("orders")
public List<Order> getOrders(Pageable pageable);

Когда я отправляю запрос типа http://localhost:8080/api/orders/sort=numberOfContracts,desc&size=100&page=0 на конечную точку, страница содержит информацию о заказе. Затем мой контроллер вызывает мой

public interface OrderRepository extends PagingAndSortingRepository<Order, Integer>

ведьма предоставляет этот метод:

Page<Order> findAll(Pageable page);

После этого весна и спящий режим делают свое волшебство.


Ответы:


1

Какой тип запроса HQL вы используете. Hibernate будет просто делать то, что вы ему скажете. Вам также придется использовать псевдоним HQL в предложении order by, если вы хотите, чтобы использовался псевдоним SQL:

SELECT o.id, o.numberOfContracts as num
FROM Order o
ORDER BY num desc
12.11.2020
  • Привет, я не использую запрос HQL напрямую. Я использую org.springframework.data.repository.PagingAndSortingRepository, где у меня есть метод findAll(). Этот метод принимает ``` org.springframework.data.domain.Pageable```, и этот pageable содержит мои свойства, по которым должен быть упорядочен результат. В примере свойство называется numberOfContracts. 12.11.2020
  • Spring Data JPA не поддерживает это, поэтому единственный способ заставить это работать — напрямую использовать HQL. Вы также можете удалить поле numberOfContracts и вместо этого использовать проекцию DTO для этого метода, где вы можете использовать HQL или SQL. 12.11.2020
  • Спасибо за ваш ответ. посмотрю проекцию 12.11.2020
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..