2011-08-24 116 views
0

我已經重寫了這個問題來說明問題。休眠當前日期不起作用

我有一個這樣的實體:

@Entity 
@NamedQueries({ 
    @NamedQuery(
     name = "myObj.findCurrentUsingFunction", 
     query = "from MyObj where insertDate = current_date() "), 

    @NamedQuery(
     name = "myObj.findCurrentUsingParameter", 
     query = "from MyObj where insertDate = :currentDate") 
}) 

public class MyObj { 
    @Id @GeneratedValue @Column 
    private Long id; 

    @Column @Temporal(TemporalType.DATE) 
    private Date insertDate; 

    /* getter, setter */ 
} 

我有一個失敗的測試:

@Test 
public void findCurrentUsingFunction() throws Exception { 
    final MyObj myObj = new MyObj(); 
    myObj.setInsertDate(new Date()); 
    final Session session = dao.getSessionFactory().getCurrentSession(); 
    session.saveOrUpdate(myObj); 
    final Query namedQuery = 
     session.getNamedQuery("myObj.findCurrentUsingFunction"); 
    final List results = namedQuery.list(); 
    Assert.assertEquals("size",1L, (long) results.size()); 
} 

Hibernate: select hibernate_sequence.nextval from dual Hibernate: insert into MyObj (insertDate, id) values (?, ?) Hibernate: select myobj0_.id as id0_, myobj0_.insertDate as insertDate0_ from MyObj myobj0_ where myobj0_.insertDate=current_date

java.lang.AssertionError: size expected:<1> but was:<0>

和通過的測試

@Test 
public void findCurrentUsingParameter() throws Exception { 
    final MyObj myObj = new MyObj(); 
    myObj.setInsertDate(new Date()); 
    final Session currentSession = dao.getSessionFactory().getCurrentSession(); 
    currentSession.saveOrUpdate(myObj); 
    final Query namedQuery = 
     currentSession.getNamedQuery("myObj.findCurrentUsingParameter"); 
    namedQuery.setDate("currentDate", new Date()); 
    final List results = namedQuery.list(); 
    Assert.assertEquals("size",1L, (long) results.size()); 
} 

的話是:

hibernate.dialect=org.hibernate.dialect.Oracle10gDialect

+1

您的超鏈接已損壞。什麼不行?異常,堆棧跟蹤?不是你期待的結果?什麼是insertDate的映射?數據庫中的列類型是什麼?它在數據庫中的價值是什麼? –

+0

可能的重複[如何在HQL查詢中使用當前日期與Oracle數據庫?](http://stackoverflow.com/questions/513317/how-do-i-use-the-current-date-in -an-hql-query-with-an-oracle-database)(看看[接受的答案](http://stackoverflow.com/questions/513317/how-do-i-use-the-current- date-in-hql-query-with-an-oracle-database/513367#513367)) –

+0

@JB鏈接沒有中斷。 –

回答

5

您在HSQL語句中使用了一個sql函數,所以它不起作用。要麼刪除括號使用Hibernate CURRENT_DATE功能,如:

@NamedQuery(
    name = "entity.findCurrent", 
    query = "from EntityName where insertDate = current_date") 

或者,我會做這樣的(其實我也將使用joda-time創建我的日期時間變量的currentdate)

@NamedQuery(
    name = "entity.findCurrent", 
    query = "from EntityName where insertDate = :currentDate") 

然後通過日期,當你調用命名查詢

session.getNamedQuery(findCurrent).setDate("currentDate", currentDate); 

,或者你可以使用一個critiera

+0

那麼,我當然可以做到這一點,這是我正在做的,直到我得到一個解決方案。但問題是關於爲什麼current_date()函數不適合我。 –

+0

@NimChimpsky:current_date()也是一個HQL函數。參見http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#queryhql-expressions –

+1

@JB Nizet,沒有方括號,用方括號表示它不是。 – NimChimpsky