当前位置: 首页 > 面试题库 >

使用Hibernate Criteria API编写HQL子句

计向晨
2023-03-14
问题内容

我想编写一个方法,该方法返回按字段“ 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的子句…


问题答案:

您将要对分离的子查询使用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"));

这反映了您在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

让我知道这是否适合您。



 类似资料:
  • 我对冬眠很陌生。 所有实体都与表名和列名相同。这个查询在mysql中运行良好。我想用HQL编写这个查询。 我将如何在hql中编写这个?请任何人帮帮我。

  • 我是SpringWebFlux反应型新手。我使用R2DBC postgresql。我有这样一个存储库: 现在我想通过许多复杂的条件为查询添加自定义方法: 我的实施: 我的问题在上面的代码中: 如何获得EntityManager? 如何从我构建的HQL查询中获取Flux? 当我问这些问题时,我的意思是“如何用Spring反应式/r2dbc方式实现”,而不是“如何用JDBC实现这种常规方式”

  • 问题内容: 我在将下面的SQL转换为Zend Db查询时遇到了一些问题。 我之前已经了解了代码-但Zend Db无法正确生成查询。谁能告诉我我想念的东西吗? SQL确实可以正常工作。我想使用Zend Paginator功能来使用Zend Db重写它。 任何帮助是极大的赞赏。 J 问题答案: 这个: 给出以下内容:

  • 问题内容: 我正在努力编写一个HQL查询以在表中插入新记录。我已经看到了一些插入查询,如下所示,但我不想从下面的代码插入另一个表中的数据。 例如,我有一个表“ User”,其中有三个字段,例如名称,年龄,数字,并且有该用户表的实体。插入查询将是什么? 问题答案: 在HQL中,仅支持INSERT INTO…SELECT…。没有INSERT INTO…VALUES。HQL仅支持从另一个表插入。 因此可

  • 我是HQL的新手。请告诉我如何在HQL中编写这个查询。 我的SQL方法是 我的SQL查询是 其中,id和日期是动态的 请在Hql查询中转换此sql查询

  • 对于上面的查询,我得到了错误