2011-12-27 73 views
2

嗨MySQL的DATE_SUB()函數,我必須寫在Hibernate查詢像如何實現Hibernate 3.0的

SELECT * FROM `tablename` where created_at> DATE_SUB(curdate(),INTERVAL 7 DAY) 
處於休眠

。我已發佈有關此主題的查詢。但沒有人幫助我。在hiberanate中可以寫這樣的查詢嗎?請回復。

+0

這個問題有回答嗎?.. – anoop 2011-12-27 21:02:56

回答

7

您可以使用一個native SQL query

String sql = "SELECT * FROM tablename WHERE created_at > DATE_SUB(curdate(), INTERVAL 7 DAY)" 
Query query = session.createSQLQuery(sql); 
List result = query.list(); 

或者你也可以使用Hibernate的標準Restrictions.sqlRestriction

String sqlWhere = "{alias}.created_at > DATE_SUB(curdate(), INTERVAL 7 DAY)"; 
Criteria criteria = session.createCriteria(MyEntity.class); 
criteria.add(Restrictions.sqlRestriction(sqlWhere)); 
List result = criteria.list(); 

希望有所幫助。

+1

謝謝yoooooou tscho你救了我的命......謝謝。 – anoop 2011-12-28 05:37:16

+0

@anoopkattodi:yw,請注意,我編輯了我的答案並修復了'Restrictions.sqlRestriction'的代碼示例。 – tscho 2011-12-28 11:30:51

+0

第二種解決方案適用於我。 – abbas 2013-07-11 09:25:23

0
String sql1 = "select uh.ServiceDate from tablename uh WHERE uh.ServiceDate >= DATE_SUB(curdate(), INTERVAL 1 YEAR)"; 

Query query1 = session.createSQLQuery(sql1); 

List result = query1.list(); 

     use this list in HQL 

String queryString = "delete from tablename u where u.serviceDate in (:result)"; 
query =session.createQuery(queryString); 
query.setParameterList("result", result); 
1

您還可以擴展hibernate的mysql方言以支持date_add函數。

public class CommonMySQL5InnoDBDialect extends MySQL5InnoDBDialect { 
    public CommonMySQL5InnoDBDialect() { 
     super(); 
     //mysql date_add function support. 
     registerFunction("date_add_interval", new SQLFunctionTemplate(DateType.INSTANCE, "date_add(?1, INTERVAL ?2 ?3)")); 
    } 
} 

然後你就可以使用HQL中的註冊函數。

from tablename where created_at > date_add_interval(curdate(), 7 DAY) 
+0

這對我來說很有幫助,只需要在HQL中做一些小改動:從表名where created_at> date_add_interval(curdate(),7,DAY) – RonyK 2018-01-11 17:02:01

相關問題