Hibernate Projection返回结果为Object

时间:2012-05-22 09:54:10

标签: java sql hibernate postgresql

我想在hibernate

中使用投影编写以下sql
SELECT id, name, MAX(ver)
  FROM bizterm
 WHERE name ILIKE '%AB%'
 GROUP BY name, id  order by name asc

我写了以下代码

Session session=sessionFactory.getCurrentSession();
            Criteria criteria=session.createCriteria(BizTerm.class);
            criteria.add(Restrictions.ilike("name", searchString,MatchMode.ANYWHERE));
            criteria.addOrder(Order.asc("name"));
            ProjectionList projList=Projections.projectionList();
            projList.add(Projections.max("ver"));
            projList.add(Projections.groupProperty("id"));
            projList.add(Projections.groupProperty("name"));
            criteria.setProjection(projList);

在表id中,ver是PKEY。 这个查询运行正常,但结果我得到的值只有3列,即ver,id,name也是Object,还有其他列如状态,BizTerm表中的级别结果集中没有返回这些值。我怎样才能使用投影?我试过了projList.add(Projections.property("status"));,但它不起作用。 我希望执行此查询

SELECT id, name,status,level MAX(ver)
  FROM bizterm
 WHERE name ILIKE '%AB%'
 GROUP BY name, id  order by name asc using projection in hibernate

1 个答案:

答案 0 :(得分:1)

喜欢这个..现在它的工作没有错误

Criteria criteria=session.createCriteria(BizTerm.class);
            criteria.add(Restrictions.ilike("bizTermName", searchString,MatchMode.ANYWHERE));
            criteria.addOrder(Order.asc("bizTermName"));
            ProjectionList projList=Projections.projectionList();
            projList.add(Projections.max("bizTermversion"));
            projList.add(Projections.groupProperty("bizTermId"));
            projList.add(Projections.groupProperty("bizTermName"));
            projList.add(Projections.max("status"));
            projList.add(Projections.max("levels"));
            projList.add(Projections.max("createDate"));
            projList.add(Projections.max("modifyDate"));

注意:我不需要最大的状态,级别,createDate,modifyDate但是如果我没有在max函数中写入它们那么会出现以下错误

[Error Code: 0, SQL State: 42803]  : column "levels" must appear in the GROUP BY clause or be used in an aggregate function

使用max函数似乎一切都很好