У меня есть 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 id1com.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);
После этого весна и спящий режим делают свое волшебство.
org.springframework.data.repository.PagingAndSortingRepository
, где у меня есть методfindAll()
. Этот метод принимает ``` org.springframework.data.domain.Pageable```, и этот pageable содержит мои свойства, по которым должен быть упорядочен результат. В примере свойство называется numberOfContracts. 12.11.2020