2011-11-22 67 views
2

我需要以非常快的方式檢查數據庫中是否存在一行。 假設我有主鍵。 我發現了Hibernate的常見問題網頁此代碼段:使用Hibernate&spring檢查數據庫中是否存在行的最快方法是什麼?

Integer count = (Integer) session.createQuery("select count(*) from ....").uniqueResult(); 

我只是用春季開始,所以我有HibernateTemplate的對象注入到我的課。 如何翻譯此代碼段以使用HibernateTemplate。

有沒有人知道比這更好/更快的方式?

謝謝。

+0

這似乎是一種檢查列中是否存在數據庫的方式。使用標準的Java SQL API - http://docs.oracle.com/javase/6/docs/api/java/sql/ResultSetMetaData.html讀取表格的元數據會更清晰。 – Perception

+0

這是不好的,使用hibernate的整個想法是將數據庫從業務邏輯中分離出來。如果我以後決定改用另一個DB呢? – stdcall

+0

那麼,把邏輯放在一個數據庫層級? – Perception

回答

3
Long count = hibernateTemplate.execute(new HibernateCallback<Long>() { 
    @Override 
    public Long doInHibernate(Session session) { 
     return (Long) session.createQuery("select count(someEntity.id) from SomeEntiuty someEntity ...").uniqueResult(); 
    } 
}); 

Hibernate之前使用Integer計數查詢,但現在使用Long。另外請注意,即使不被棄用,Spring建議不要再使用HibernateTemplate,並直接使用Hibernate API(使用sessionFactory.getCurrentSession())。

0

同樣這也取決於你使用MyISAM和innodb的引擎。

select count(col1) from table;將返回列不爲null的行數。

select count(*) from table;將返回行數。

根據您正在使用的數據庫,select count(*)將比從元數據表或系統級表中讀取它更加昂貴,後者跟蹤行數。 只是我2美分。

取決於各種其他因素,如索引和其他信息/連接/訪問權限,這可能會更快

SELECT table_rows FROM `information_schema`.`TABLES` where table_schema = 'database_schema_name' and table_name = 'table_name'; 
+0

我目前正在使用mysql for runtime&h2進行測試 – stdcall

0

我認爲這是更好地得到發現第一行的具體代表字段(使用PK或至少需要另一個索引字段),而不是計算與您的搜索條件匹配的所有可能記錄。

如果你使用Spring,如果沒有找到記錄,它將拋出EmptyResultDataAccessException。

0

檢查主鍵存在或不存在於數據庫中的最快方法。

public void exist(Long id) { 
    Session session = sessionFactory.getCurrentSession(); 
    String queryString = "select 1 from Employee e where e.id= :id"; 
    Query query = session.createQuery(queryString); 
    query.setParameter("id", 1l); 
    Integer result = (Integer) query.uniqueResult(); 
    System.out.println(result); 

} 
相關問題