2014-03-13 139 views
0

我是新來的休眠,並試圖做一個查詢使用休眠。在DB中直接執行查詢時工作正常。你能幫我寫一下休眠嗎?休眠 - 幫助需要編寫查詢

select A.SL_NO, A.DATETIME,A.IP,A.CATEGORY,A.SUBCATEGORY,A.VALUE FROM APP_MON_REF_TABLE A, 
(SELECT category, max(to_char(datetime,'YYYY-MM-DD HH24:MI:SS')) maxtime from APP_MON_REF_TABLE group by category) B 
where A.category = B.category and to_char(A.datetime,'YYYY-MM-DD HH24:MI:SS') = B.maxtime 

預期的答案如下提前

SL_NO  DATETIME   IP  CATEGORY SUBCATEGORY VALUE 

5  01/02/2014 12:12:30 12 TABLE SPACE DATA01  65% 
6  01/02/2014 12:12:30 23 TABLE SPACE DATA01  65% 

感謝。 數學

+1

退房[休眠標準](http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/querycriteria.html)。構建這樣的查詢最靈活的方法是通過Criteria構建它;這也會使結果更容易映射回實體類。 –

+0

用你的實體變量名替換你的表列名稱,然後你的HQL查詢就快準備好了.... – BDR

+0

如果你對HQL和其他方法創建hiberanate'criteria'沒有太多的想法,那麼你可能會知道,這麼多信息不足以爲您準備查詢。進一步的Hibernate也支持原生的'SQL查詢'。但是這不被推薦。無論如何,如果你想在Hibernate中繼續使用SQL查詢,那麼在你的查詢中不需要改變。 – sakura

回答

0

你可以使用 String query = "select A.SL_NO, A.DATETIME,A.IP,A.CATEGORY,A.SUBCATEGORY,A.VALUE FROM APP_MON_REF_TABLE A, (SELECT category, max(to_char(datetime,'YYYY-MM-DD HH24:MI:SS')) maxtime from APP_MON_REF_TABLE group by category) B where A.category = B.category and to_char(A.datetime,'YYYY-MM-DD HH24:MI:SS') = B.maxtime" entityManager.createNativeQuery(query).getResultList() 或者你在POJO的映射表,然後使用HQL查詢。

+0

您還應該指出,這不是在HQL中建議的方式,除非您有理由證明它的正確性。 – sakura

+0

totaly agree @sakura – AhmedJava

1

HQL不適用於內聯視圖,即(from(select ...))。但是,在你的情況下,你只是使用該視圖來建立基於類別的最大日期。所以,我會首先重寫你的SQL查詢來是這樣的:

SELECT A.sl_no, 
     A.datetime, 
     A.ip, 
     A.category, 
     A.subcategory, 
     A.value 
FROM app_mon_ref_table A 
WHERE A.datetime = (SELECT max(datetime) maxtime 
     FROM app_mon_ref_table b 
     where B.category = A.category 
     GROUP BY category) 

*注意:你真的不需要這些TO_CHAR或者,除非那些實際上是時間戳字段。日期(在oracle中)將與第二個分辨率進行比較。我已經從我的答案中刪除了那些to_char cols,因爲這是一個不同的問題,無論如何。*

至於在hql中重寫,你還沒有發佈POJO代碼,所以它很難,但它會是非常類似於sql:

from AppMonRef A where A.datetime = (SELECT max(datetime) maxtime 
     FROM AppMonRef b 
     where B.category = A.category 
     GROUP BY category) 

如果您想限制爲這些字段,則可以添加投影。但是這個HQL查詢會給你一個託管的AppMonRef對象,服從任何你有關於屬性延遲加載的聲明。

0

嘗試這種情況:

String sql = "select A.SL_NO, A.DATETIME, A.IP, A.CATEGORY, A.SUBCATEGORY, A.VALUE FROM APP_MON_REF_TABLE A, " + 
        "(SELECT category, max(to_char(datetime,'YYYY-MM-DD HH24:MI:SS')) maxtime from APP_MON_REF_TABLE group by category) B " + 
        "where A.category = B.category and to_char(A.datetime,'YYYY-MM-DD HH24:MI:SS') = B.maxtime"; 

    SQLQuery sqlQuery = getCurrentSession().createSQLQuery(sql); 
    sqlQuery.addEntity("A", YourEntity.class); 
    sqlQuery.addScalar("maxtime", StandardBasicTypes.CHARACTER_ARRAY); 

    List<Object[]> results = sqlQuery.list(); 
    for (Object[] result : results) { 
     YouEntity a= result[0]; 
     String maxTime = (String) result[1]; 
    }