2011-12-29 2 views
0

기준을 사용하여 다음 쿼리를 생성해야합니다. 어떻게해야합니까?최대 절전 기준에서 함수를 사용하여 쿼리를 가져 오는 방법은 무엇입니까?

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; 

답변

0

당신은 데이터베이스를 지정하지 않았지만 date_format 아마 Hibernate에 의해 상자에서 지원되지 않습니다. 기준을 통해 실제로 수행하려는 경우 비교를 위해 Criterion을 구현하고 group byProjection으로 구현해야합니다.

당신은 또한 당신이 여기 네이티브 SQL 쿼리를 작성하는 더 좋을 수 있다는 것 date_format

지원하기 위해 구현해야합니다 사용자 정의 방언으로 HQL을 사용할 수 있습니다. Hibernate는 필요한 모든 것을 제공한다.

0

먼저, 나는이 기준을 사용하지 않을 것입니다. 조건은 변수 검색 기준에 따라 쿼리를 동적으로 생성해야하는 경우에 유용합니다. 쿼리는 완전히 정적이며 엔터티는 있지만 스칼라는 반환하지 않으며 이미 가지고 있습니다. 왜 SQL 쿼리를 사용하지 않는가? 또는 테이블 및 열 이름을 하드 코딩하지 않으려면 적어도 HQL 쿼리를 사용하십시오.

일부 확실하지 않은 이유로이 쿼리를 실행할 수있는 기준이 유일한 경우 SQL의 쿼리 결과를 서식 지정하지 않습니다. 나는 자바에서 그것을 할 것이고, 적어도 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 또는 기준에 실행하는 간단한된다.

+0

이 쿼리는 모든 날짜의 레코드를 반환합니다. 그러나 나는 그것을 한 달 동안 그룹화해야한다. – Jothi

+0

원래 쿼리는 작업자와 월별로 그룹화되지만 한 달 (현재 달)에만 관심이 있습니다. 사실, 그것은 작업자별로 그룹화되며, 내 쿼리도 마찬가지입니다. –

관련 문제