【发布时间】:2018-05-11 15:10:27
【问题描述】:
我在 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() {
}
}
【问题讨论】:
-
可以发
EmployerVisit实体类吗?