Hibernate - 编写查询所需的帮助

时间:2014-03-13 05:51:25

标签: java hibernate oracle10g

我是hibernate的新手,正在尝试使用hibernate进行查询。直接在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%

提前致谢。 数学

3 个答案:

答案 0 :(得分: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对象,该对象遵循您在属性上延迟加载的任何声明。

答案 1 :(得分: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查询。

答案 2 :(得分: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];
    }