【发布时间】:2020-11-11 10:14:08
【问题描述】:
我有 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_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 (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 这样的请求时
对于端点,pageable 包含有关排序的信息。然后我的控制器调用我的
public interface OrderRepository extends PagingAndSortingRepository<Order, Integer>
witch 提供了这个方法:
Page<Order> findAll(Pageable page);
在这之后 spring 和 hibernate 发挥他们的魔力。
【问题讨论】:
标签: java hibernate spring-data-jpa db2 sql-order-by