【问题标题】:Hibernate query with @Formula-annotated attribute in order by clause具有@Formula-annotated 属性的休眠查询按子句排序
【发布时间】: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&amp;size=100&amp;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


    【解决方案1】:

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

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

    【讨论】:

    • 嗨,我没有直接使用 HQL 查询。我正在使用org.springframework.data.repository.PagingAndSortingRepository 我有我的findAll() 方法。这个方法需要一个``` org.springframework.data.domain.Pageable``` 并且那个pageable包含我的属性,结果应该被排序。对于示例情况,该属性被命名为“numberOfContracts”。
    • Spring Data JPA 不支持该功能,因此实现此功能的唯一选择是直接使用 HQL。您还可以删除 numberOfContracts 字段并使用 DTO 投影代替此方法,您可以使用 HQL 或 SQL。
    • 感谢您的回复。我会看看投影
    猜你喜欢
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 2012-09-20
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多