Sql 在hql中按最大值查找具有最大日期的值之间的差异排序的列表
我在博士后有一张桌子Sql 在hql中按最大值查找具有最大日期的值之间的差异排序的列表,sql,hibernate,hql,Sql,Hibernate,Hql,我在博士后有一张桌子 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
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天的访问找到顶级雇主-(根据上次记录和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());
因为表groupedEv
在orderby
在hibernate中可以使用无擦伤的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;
Query Query=getSession().createQuery(
“从EmployerVisit AS ev中选择ev和(ev.visitCounter)作为计数器”+
“其中ev.employerVisitId.date>:日期”+
“按ev.EMPLOYERSITID.employerId、ev.EMPLOYERSITID.date分组”+
“ORDER BY counter DESC”).setMaxResults(size).setParameter(“日期”,calendar.getTime());
列表顶部=新的ArrayList();
对于(对象结果:query.list()){
对象[]dividedResult=(对象[])结果;
EmployerVisit EmployerVisit=(EmployerVisit)dividedResult[0];
EmployerVisitDto EmployerVisitDto=getEmployer(employerVisit.getEmployerId()).toEmployerVisitDto();
EmployerServicedTo.setPeopleVisited(((长)dividedResult[1]).intValue());
top.add(employerVisitDto);
}
返回顶部;
你能发布员工服务吗?
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;