我是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%
提前致谢。 数学
答案 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];
}