2011-11-15 33 views

回答

6

我假設你正在做這個分頁的目的。

您可以創建一個查詢,並使用setMaxResults和setFirstResult:

public List<User> getUsers(int limit) 
{ 
    Query q = getHibernateTemplate().getSession().createQuery("from User"); 
    q.setFirstResult(0); // modify this to adjust paging 
    q.setMaxResults(limit); 
    return (List<User>) q.list(); 
} 

或者,使用HibernateCallback(這可能是最好的方法,雖然它的wordier):

return getHibernateTemplate().executeFind(new HibernateCallback() { 
     public Object doInHibernate(Session session) throws HibernateException, SQLException { 
      Query q = session.createQuery("from User"); 
      q.setMaxResults(limit); 
      return q.list(); 
     } 
    }); 

哪樣另外照顧你的例外翻譯。這裏

+1

我必須發佈會話嗎? getSession和gethibernatetemplate有什麼區別? – Blankman

+0

我只想這樣做:select * from users; (以及啓動/限制過濾器)。 – Blankman

+0

@Blankman對不起,我忘了在裏面包含getHibernateTemplate()。 –

-1

檢查,看一個HibernateTemplate可用的方法: http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/orm/hibernate3/HibernateTemplate.html

根據您想如何查詢,有幾個不同的查找方法返回一個列表。

  • find(String queryString)將讓您運行特定的HQL查詢並返回結果列表。

  • loadAll(Class entityClass)將返回映射類的所有實例的列表,您可以自己對其進行過濾。

無論哪種方式我會玩弄文檔中的方法來習慣HibernateTemplate。

如果你只是想「從用戶中選擇*」,請確保你已經映射了User類和getHibernateTemplate.loadAll(User.class);

+0

這不允許設置限制。在Hibernate 3 HQL中,LIMIT明確地不支持**,並且它僅在偶爾使用2。 –

5

如果您想使用的HibernateTemplate你可以做這樣的事情:

@SuppressWarnings("unchecked") 
public List<User> getUsers(final int limit) { 
    return getHibernateTemplate().executeFind(new HibernateCallback<List<User>>() { 
     @Override 
     public List<User> doInHibernate(Session session) throws HibernateException, SQLException { 
      return session.createCriteria(User.class).setMaxResults(limit).list(); 
     } 
    }); 
} 

@SuppressWarnings("unchecked") 
public List<User> getUsers(final int limit) { 
    return getHibernateTemplate().executeFind(new HibernateCallback<List<User>>() { 
     @Override 
     public List<User> doInHibernate(Session session) throws HibernateException, SQLException { 
      return session.createQuery("from User u").setMaxResults(limit).list(); 
     } 
    }); 
} 

其實它不建議再使用Hibernate的模板。您應該注入SessionFactory並調用SessionFactory.getCurrentSession()Here是關於如何設置它的更多信息。而here就是爲什麼你應該比HibernateTemplate更喜歡SessionFactory。

+0

有關單元測試的任何提示?鏈接?謝謝! – Blankman

+1

要測試DAO的客戶端,您應該使用以下某些模擬DAO:[Mockito](http://code.google.com/p/mockito/),[JMock](http://www.jmock.org/ ),[EasyMock](http://easymock.org/)等。爲了測試DAO類本身,請注意[DBUnit](http://dbunit.sourceforge.net/)加載數據並比較ResultSets,[Spring TestContext框架](http://static.springsource.org/spring/docs/2.5.x/reference/testing.html#testcontext-framework)及其[支持事務](http:// static。 springsource.org/spring/docs/2.5.x/reference/testing.html#testcontext-tx)。 – szhem

+1

對於簡單的DAO測試,您還可以使用一些內存數據庫:[Derby](http://db.apache.org/derby/),[HSQLDB](http://hsqldb.org/)。在這種情況下,你將不得不改變這種測試的休眠方言。我建議使用等於生產數據庫的數據庫。在這種情況下,您將能夠使用供應商特定的數據庫功能。還有一個強大的庫支持DAO集成測試的許多功能:[Unitils](http://www.unitils.org/summary.html) – szhem

相關問題