gpt4 book ai didi

java - 使用 Hibernate Criteria 按子查询结果排序

转载 作者:行者123 更新时间:2023-11-30 08:44:55 24 4
gpt4 key购买 nike

我正在尝试将此 SQL 查询转换为 Hibernate Criteria,但不太确定如何,因为我是 Hibernate 的新手。

SELECT header.*,
(SELECT items.end_date from
subTable sub,
ItemTable items
WHERE items.sub_id = sub.sub_id
and header.header_id = sub.header_id
order by items.end_date desc
limit 1) as latestEndDate
from headerTable header
order by latestEndDate desc;

我可以创建子查询,但我不知道如何将它合并到主查询中。

Long headerId = getHeaderId();
Criteria criteria = session.createCriteria(dataaccess.model.Item.class, "item");

DetachedCriteria headerSubQuery =
DetachedCriteria.forClass(dataaccess.model.Header.class, "header")
.setProjection(Property.forName("header.headerId"))
.add(Restrictions.eq("headerId, headerId));

DetachedCriteria subTableQuery =
DetachedCriteria.forClass(dataaccess.model.SubTable.class, "sub")
.setProjection(Property.forName("sub.subId)).add(
Property.forName("header").in(headerSubQuery));

criteria.add(Property.forName("sub").in(subTableQuery));
criteria.addOrder(Order.desc("endDate"));
criteria.setMaxResults(1);

List<Items> items = criteria.list();

*HeaderTable 和 SubTable 具有 1:1 的关系,并且仅出于遗留原因而存在。 SubTable 拥有 Items,但由于 1:1 的关系,HeaderTable 也拥有 Items(HeaderTable -> SubTable -> Items)。

该查询返回具有最新结束日期的项目。我希望能够使用 Hibernate 查询 header 表并按其中一项的最新结束日期排序(如上面的 SQL 查询中所示)。

感谢您的帮助。

最佳答案

我最终通过向 Header 模型添加另一个字段并使用 @Formula 批注传入我的 SQL 查询来解决此问题。

@Formula("(SELECT items.end_date from "
+ "subTable sub, "
+ "ItemTable items "
+ "WHERE items.sub_id = sub.sub_id "
+ "and header.header_id = sub.header_id "
+ "order by items.end_date desc "
+ "limit 1)")
private Date latestStartDate;

public getLatestStartDate() {
return latestStartDate;
}

这让我可以在我的标准中附加一个订单:

criteria.addOrder(Order.desc("latestStartDate"));

关于java - 使用 Hibernate Criteria 按子查询结果排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33578388/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com