어떻게 수행 날짜 작업에서 최대 절전 모드
문제
내가 수행하려는 시간을 데이터 작업이 최대 절전 모드를 사용하여 조회.
를 추가하려면 빼기 두 날짜뿐만 아니라 내가 원하는 빼기 1 년 또는 1 개월에서 특정 날짜입니다.
이것은 어떻게 사용하여 가능한 조회에서는 최대 절전 모드?
해결책
보다HQL에서 날짜/시간 수학 수행?예를 들어.
맞춤형 SQL을 사용하려면 자체 최대 절전 모드 방언을 작성하고 등록해야합니다.
registerFunction("weekday",
new SQLFunctionTemplate(Hibernate.INTEGER, "to_char(?1,'D')") );
다른 팁
자신만의 방언을 만들어야합니다. 다음과 같은 것 :
public class MyDialect extends MySQLInnoDBDialect{
public myDialect() {
super();
registerFunction("date_add_interval", new SQLFunctionTemplate(Hibernate.DATE, "date_add(?1, INTERVAL ?2 ?3)"));
}
}
최소한 Hibernate/MySQL에서는 UNIX 타임 스탬프로 오지서 변환 할 수 있습니다. UNIX 타임 스탬프는 정수이므로 정수 수를 추가 할 수 있습니다.
FROM_UNIXTIME(UNIX_TIMESTAMP(date)+ (allowedTimeWindow*86400)) as deadline
제한 사항이 있지만 위의 접근 방식보다 훨씬 쉽습니다.
이것은 오픈 문제에 왔습니다.로 최대 절전 모드 3.3 표준 방법이 없을 처리하는 날짜를 비교 순서 조회:
https://hibernate.atlassian.net/browse/HHH-2434
Hibernate4.3 는 기능을 제공하여 액세스한 날짜/시간에 조회는:
current_timestamp() , current_date() , current_time()
연산여 관리 할 수 있습니다:
SECOND(...) , MINUTE(...) , HOUR(...) , DAY(...) , MONTH(...) , YEAR(...)
면책 조항 : 저는 Java 초보자입니다
나는 사용할 수 있었다 current_date() >= fromDate AND dateadd(day, -1, getdate()) <= toDate
기능을 등록하지 않고 Hibernate 3.5.3의 Sybase DB에 대한 HQL 문에서.
JPA + Hibernate 4.3.1 + mysql 5에 대한 방언이있는 접근 방식의 사용 샘플
공개 클래스 samplemysql5innodbdialect 확장 org.hibernate.dialect.mysql5innodbdialect {
public SampleMySQL5InnoDBDialect() {
super();
registerFunction("date_sub_days", new SQLFunctionTemplate(StandardBasicTypes.DATE, "date_sub(?1, interval ?2 day)"));
}
그런 다음 매핑 주석이있는 수업의 경우 :
@NamedQuery(name = "SampleEntity.getSampleEntitiesForGapOverlapCalculations", query = "from SampleEntity as se where "
+ "((se.toDate between :startDate and :endDate) or (date_sub_days(se.toDate, se.duration) between :startDate and :endDate)) order by se.toDate asc, se.duration desc")
샘플 가지다 토데이트 유형의 필드 java.sql.date 및 지속 정수 필드 (일 기간) 그리고 우리는 계산 중입니다. Fromdate = Todate- 시간 그리고 모든 엔터티를 선택합니다 Fromdate 또는 토데이트 내부 간격 startDate, endDate.
Hibernate4.3은 날짜/타임 스탬프에 액세스하고 산술 작업을 수행하기위한 기본 기능을 제공합니다.
여기 HQL에서 어떤 표현식을 사용할 수 있는지에 대한 문서화에 대한 링크입니다. 내가 언급하는 몇 가지 : 액세스 날짜/시간 :
current_date(), current_time(), and current_timestamp()
산술 작업은 다음을 통해 수행 할 수 있습니다. 이러한 기능은 입력으로 시간이 걸립니다.
second(...), minute(...), hour(...), day(...), month(...), and year(...)
HQL의 절대적인 차이를 얻을 수 있습니다
current_timestamp() - dateInstance
DateInstance가 정의를 가질 수있는 곳
@Column(name = "updated_at")
@Temporal(TemporalType.TIMESTAMP)
private java.util.Date updatedAt;
결과는 0.1 초입니다. 따라서 1 초의 절대적인 차이의 경우 위의 표현식은 결과를 10으로 제공합니다.
따라서 쿼리는 다음과 같습니다.
select t from Table t where (current_timestamp() - updatedAt)>600
Postgres 사용자 ...
registerFunction("dateadd", new SQLFunctionTemplate(StandardBasicTypes.DATE, "(?1 + INTERVAL ?2)"));
SQL 사용법은 다음과 같습니다.
now() < dateadd(:mydate, '-1 day')