如何在休眠标准中使用函数获取查询?

时间:2011-12-29 07:52:47

标签: hibernate

我需要使用条件生成以下查询..怎么办?

select worker_id,date_format(date,'%m-%Y'),sum(SalaryPerDay),sum(attendance) from tbl_attendance
where worker_id is not null and  date_format(date,'%m-%Y') = date_format(now(),'%m-%Y')
group by worker_id, date_format(date,'%m-%Y')
order by date,worker_id

public class Attendance  {

    /**
     * 
     */
    private static final long serialVersionUID = 4917788836066742576L;
    private Integer attendanceId;
    private Date date;
    private Integer workerId;
    private Integer vehicleId;
    private Integer salaryId;
    private Double salaryPerDay;
    private Double attendance;
    private Double startingTime;
    private Double closingTime;

2 个答案:

答案 0 :(得分:0)

您没有指定数据库,但Hibernate可能不会支持date_format。 如果你真的想通过Criteria完成它,你可能需要实现自己的Criterion进行比较,Projection进行group by

你也可以使用HQL和你需要实现的自定义方言来支持date_format

您可能最好在此处编写本机SQL查询。 Hibernate为您提供所需的一切。

答案 1 :(得分:0)

首先,我可能不会使用此标准。当必须基于可变搜索条件动态生成查询时,条件很有用。您的查询是完全静态的,不返回实体而是标量,并且您已经拥有它。为什么不使用SQL查询?如果您不想对表名和列名进行硬编码,请至少进行HQL查询。

如果标准出于某些不明原因,是执行此查询的唯一可接受方式,我不会在SQL中格式化查询结果。我会用Java来做,这至少会使select和group by子句更容易生成。

唯一困难的是日期格式。但是等等,您的查询选择必须全部在当月的行。所有返回的行将具有相同的格式化日期。那么,为什么要首先选择呢?

事实上,您的查询可以按原样重写:

select worker_id ,sum(SalaryPerDay), sum(attendance) from tbl_attendance
where worker_id is not null 
and date >= :startOfCurrentMonth, 
and date < :endOfNextMonth
group by worker_id
order by worker_id

突然之间,在HQL或Criteria中执行变得简单。