gpt4 book ai didi

java - 使用 Hibernate Criteria API 编写 HQL 子句

转载 作者:搜寻专家 更新时间:2023-10-31 20:14:56 24 4
gpt4 key购买 nike

我想编写一个方法来返回按字段“serviceId”分组的最后添加的对象列表。

以下 HQL 有效,但我想使用 Criteria API 编写:

FROM Notification WHERE date IN 
(SELECT MAX(date) FROM Notification GROUP BY serviceId)
ORDER BY date ASC

像这样:

Criteria crit = session.createCriteria(Notification.class);
crit.add(Restrictions.in("date", <MAX dates>));
criteria.addOrder(Order.desc("date"));

提前致谢。

编辑:

现在我需要一个使用 eclipselink API 的类似查询 =/
基本上,我需要最后 N 行(最大日期),其状态是下面描述的五个之一,按 serviceId 列分组。
由于我缺乏经验,这是我能做的最好的:

ExpressionBuilder builder = new ExpressionBuilder();
Expression exStatus1 = builder.get("status").equal(MessageType.START.toString());
Expression exStatus2 = builder.get("status").equal(MessageType.RUNNING.toString());
Expression exStatus3 = builder.get("status").equal(MessageType.PAUSED.toString());
Expression exStatus4 = builder.get("status").equal(MessageType.END_ERROR.toString());
Expression exStatus5 = builder.get("status").equal(MessageType.END_SUCCESS.toString());

ReadAllQuery query = new ReadAllQuery();
query.setReferenceClass(Notification.class);
query.setSelectionCriteria(((exStatus1).or(exStatus2).or(exStatus3).or(exStatus4).or(exStatus5)));
query.setMaxRows(listSize);
query.addDescendingOrdering("date");

避免在结果行中重复 serviceIds 的子句缺失...

最佳答案

您将要使用带有分 ionic 查询的 Criteria projections API:

Criteria crit = session.createCriteria(Notification.class, "main");

DetachedCriteria notificationSubQuery = DetachedCriteria.forClass(Notification.class, "sub");
notificationSubQuery.setProjection(Projections.max("date"));
notificationSubQuery.add(Restrictions.eqProperty("sub.serviceId", "main.serviceId"));

crit.add(Subqueries.propertyIn("date", notificationSubQuery));
crit.addOrder(Order.desc("date"));

这反射(reflect)了您在 HQL 查询中使用的技术。

编辑:

我更新了查询以匹配主通知类和子查询之间的 serviceId,基本上与此 HQL 查询相同:

FROM Notification main WHERE date IN 
(SELECT MAX(sub.date) FROM Notification sub WHERE sub.serviceId = main.serviceId)
ORDER BY date ASC

这可以防止您在两个不同的 serviceId 之间进行非最大日期匹配的情况,如下所示:

serviceId = 1: date = 3,4,5
serviceId = 2: date = 4,5,6

旧查询返回:

serviceId: 1, date: 5
serviceId: 2, date: 5,6

新查询返回:

serviceId: 1, date: 5 
serviceId: 2, date: 6

让我知道这是否适合您。

关于java - 使用 Hibernate Criteria API 编写 HQL 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9589299/

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