首页 > 解决方案 > 具有@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 BYformula1_

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 发挥了它们的作用。

标签: javahibernatespring-data-jpadb2sql-order-by

解决方案


您使用的是哪种 HQL 查询。Hibernate 只会做你告诉它做的事情。如果您希望使用 SQL 别名,则还必须在 order by 子句中使用 HQL 别名:

SELECT o.id, o.numberOfContracts as num
FROM Order o
ORDER BY num desc

推荐阅读