2009-10-16 4 views
0

A에는 두 개의 엔티티가 있습니다. 예를 들어 타이밍 설정 및 주문.HQL에서 날짜 필드를 빼거나 합칠 수 있습니까?

@Entity 
public class TimingSettings{ 

    @Basic 
    private Long orderTimeout = 18000; //for example 18000 sec 
    .... 
} 


@Entity 
public class Order{ 

    @Basic 
    @OneToOne 
    private TimingSettings timingSettings; 

    @Temporal(value = TemporalType.TIMESTAMP) 
    @Column(nullable = false) 
    protected Date time; 
    .... 
} 

어떤 주문에 어떤 타이밍 설정이 있는지 알지 못하기 때문에 시간 초과를 선택하고 필요한 주문 시간을 계산할 수 없습니다.

산사 나무의 열매가 나는 다음과 같은 같은 HQL을 수행 할 수 있습니다

select o from order o 
left join o.timingSettings ts 
where o.time < current_timestamp()+ ts.orderTimeout 

답변

2

이것은 모든 데이터베이스에서 작동하는지 여부에 따라 다릅니다.

후자의 경우 (특정 데이터베이스) 사용 가능한 날짜 기능에 대한 방언을 확인하십시오. 당신 또는 당신의 데이터베이스가 필요 지원하지 않는 경우 날짜 (모든 데이터베이스에 대해이 작업을 수행해야하는 경우

select o from order o 
    left join o.timingSettings ts 
where time_to_sec(timediff(o.time, current_timestamp())) < ts.orderTimeout 

: MySQL의 사투리, 예를 들어, 당신이 당신의 쿼리를 작성하는 것을 허용 것이다, timediff()time_to_sec() 기능을 지원합니다 함수들), Hibernate는 모든 방언에서 year(), month(), ... second() 함수를 지원한다. 이것들을 사용하면 쿼리가 다소 장황하게됩니다 :-) 게다가 DST에 문제가있을 것입니다.

0

문제를 arithmetics와 타임 스탬프 함께, 몇 가지 아이디어이 thread을 확인합니다.

관련 문제