java - 具有@Formula-annotated 属性的休眠查询按子句排序
问题描述
我有 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>
女巫提供了这种方法:
Page<Order> findAll(Pageable page);
在这一点之后,spring 和 hibernate 发挥了它们的作用。
解决方案
您使用的是哪种 HQL 查询。Hibernate 只会做你告诉它做的事情。如果您希望使用 SQL 别名,则还必须在 order by 子句中使用 HQL 别名:
SELECT o.id, o.numberOfContracts as num
FROM Order o
ORDER BY num desc
推荐阅读
- c++ - 使用 gdb 打印 time_t 变量
- ansible - ansible 角色似乎采取了错误的收集
- ember.js - 如何在 ember 中使用制表符?
- python - 没有更改权限的用户访问时如何使表单只读
- rabbitmq - 返回rabbitmq交换声明,队列声明和队列绑定ok
- python - 如何在熊猫中按多列分组并且仅使用日期时间的日期部分
- linux - 未为 Linux 容器自动加载 Powershell 模块
- benchmarkdotnet - 更改 BenchmarkDotnet 导出器路径
- django - url问题中的Django v3路径变量
- nativescript - 在 Nativescript 中隐藏特定 TextField 的软键盘