sql - 查找 hql 中的有序列表,最大日期值之间的最大差异
问题描述
我在 postgres 有一张桌子
CREATE TABLE employer_visit(
employer_id INTEGER REFERENCES employer,
visit_counter INTEGER NOT NULL, -- counter on current date
visit_before_date_total_counter INTEGER NOT NULL, -- total, since service has started
date DATE,
PRIMARY KEY(employer_id, date)
);
我需要通过最近 30 天的访问来找到顶级雇主 - (employer_visit
按最后一条记录中的 visit_before_date_total_counter 和 30 天前的最后一条记录之间的差异排序列表)
我试过这个 hql 查询
Query<EmployerVisit> query = getSession().createQuery(
"SELECT ev FROM EmployerVisit ev " +
"WHERE ev.employerVisitId.date = (SELECT MAX (groupedEv.employerVisitId.date) FROM EmployerVisit groupedEv " +
"WHERE groupedEv.employerVisitId.employerId = ev.employerVisitId.employerId) " +
"AND " +
"ev.employerVisitId.date = (SELECT MAX (groupedEv2.employerVisitId.date) < :date FROM EmployerVisit groupedEv2 " +
"WHERE groupedEv2.employerVisitId.employerId = ev.employerVisitId.employerId) " +
"ORDER BY (groupedEv.visitCounter + groupedEv.visitBeforeDateTotalCounter) - (groupedEv2.visitCounter + groupedEv2.visitBeforeDateTotalCounter) DESC"
).setMaxResults(size).setParameter("date", calendar.getTime());
但它与
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Invalid path: 'groupedEv.visitCounter'
因为该表groupedEv
在之后不存在ORDER BY
在hibernate中可以为这种情况使用deprecated SqlQuery,但我更喜欢hql,请帮助,谢谢。
更新!- 没有 setter 和 getter 的实体和 EmbeddedId 类
@Entity
@Table(name = "employer_visit")
public class EmployerVisit {
@EmbeddedId
private EmployerVisitId employerVisitId;
@Column(name = "visit_counter")
private Integer visitCounter;
@Column(name = "visit_before_date_total_counter")
private Integer visitBeforeDateTotalCounter;
public EmployerVisit() {
employerVisitId = new EmployerVisitId();
visitCounter = 0;
visitBeforeDateTotalCounter = 0;
}
}
@Embeddable
public class EmployerVisitId implements Serializable {
@Column(name = "employer_id")
private Integer employerId;
@Column(name = "date")
private Date date;
public EmployerVisitId() {
}
}
解决方案
这是答案
Query<Object> query = getSession().createQuery(
"SELECT ev, SUM(ev.visitCounter) AS counter FROM EmployerVisit AS ev " +
"WHERE ev.employerVisitId.date > :date " +
"GROUP BY ev.employerVisitId.employerId, ev.employerVisitId.date " +
"ORDER BY counter DESC").setMaxResults(size).setParameter("date", calendar.getTime());
List<EmployerVisitDto> top = new ArrayList<>();
for (Object result : query.list()) {
Object[] dividedResult = (Object[]) result;
EmployerVisit employerVisit = (EmployerVisit) dividedResult[0];
EmployerVisitDto employerVisitDto = getEmployer(employerVisit.getEmployerId()).toEmployerVisitDto();
employerVisitDto.setPeopleVisited(((Long) dividedResult[1]).intValue());
top.add(employerVisitDto);
}
return top;
推荐阅读
- c++ - 空闲列表分配器标头元数据
- c++ - 如何在 ImGui 中更改 InputText 的文本颜色?
- google-colaboratory - 如何从 google colab 加载保存的 h5 文件并在 PC 中使用
- java - Singletop 活动不会在按下后退按钮时恢复
- javascript - 从异步函数中隐藏 ng-repeat 列表中的单个跨度
- php - WooCommerce:从产品变体中获取自定义字段并将其显示在“附加信息区域”
- javascript - 部署时 Cloud Function 不会保存到 Firestore
- html - 如何获取 .html 网页中使用的数据?
- javascript - 为什么我有一个错误'无法读取未定义的属性'地图'?
- azure - 为 Databricks 创建 Azure Keyvault 支持的机密范围