2012-09-04 78 views
1

我有一个SQL查询,我想将其转换为一个条件(Hibernate 3.3.2)以将其用于我的持久层。 这是查询:将SQL语句转换为休眠条件(具有count子句)

select last_name 
    from member 
    where 
    member.end_date > SYSDATE 
    group by member.last_name 
    having count(member.last_name) >1; 

我已经尝试了很多组合,但没有结果,这将是对我好......这是我的代码:

Criteria criteria = getSession(false).createCriteria(Member.ENTITY_NAME); 
criteria.setProjection(Projections.projectionList() 
      .add(Projections.groupProperty("lastName")) 
      .add(Projections.count("lastName").as("cptLastName")) 
      ); 
criteria.add(Restrictions.ge("endDate", now)) 
      .add(Restrictions.le("startDate", now)) 
      //.add(Restrictions.gt("cptLastName", new Integer(1))) 
      .addOrder(Order.asc("lastName")) 
; 

与写它注释行中,我有一个对象列表,其中包含名称以及该名称在数据库中出现的次数。但是,当我想decomment它,这样的错误: 值java.sql.SQLException:ORA-00904:“Y1_”:

:无效的标识符

为了开发这个代码,我通过不同岗位的启发之下

我觉得我不远处的解决方案,但有没有人帮我吗? 如果您有任何问题,请不要犹豫,问我。 如果你发现另一个解决方法,我粘贴到这个查询,不要犹豫,建议它...

回答

1

嗨,如果我是正确的,你不能直接使用条款计数直接在休眠标准截至目前,请在修改后的查询下面找到。如果它不工作,请张贴整个堆栈跟踪

DetachedCriteria innerQuery = DetachedCriteria.forClass(Member.ENTITY_NAME, "inner"); 
    innerQuery.setProjection(Projections.rowCount()); 
    innerQuery.add(Restrictions.eqProperty("lastName", "outer.lastName")); 

    Criteria c = s.createCriteria(Member.ENTITY_NAME, "outer"); 
    c.setProjection(Projections.property("lastName")); 
    c.add(Restrictions.gt("endDate", now)) 
    c.add(Subqueries.eq(new Integer(1), innerQuery)); 
+0

谢谢您的回答...的查询的作品,但它返回了很多记录......它应该只返回8.此外,它的作品很长一段时间... – user1645271

0

我适应我的代码与你的主张,这是我所:

DetachedCriteria innerQuery = DetachedCriteria.forEntityName(Member.ENTITY_NAME,"inner") 
    .setProjection(Projections.rowCount()) 
    .add(Restrictions.eqProperty("lastName", "outer.lastName")); 

Criteria criteria = getSession(false).createCriteria(Member.ENTITY_NAME, "outer") 
    .setProjection(Projections.property("lastName")) 
    .add(Restrictions.g("endDate", now)) 
    .add(Subqueries.gt(new Integer(1), innerQuery)); 

所以,就像我在上面的评论说,它有效,但需要很长时间...给我错误的结果(它应该给我八条记录)。

我激活了显示hibernate查询(hibernate.show_sql = true)的选项。如果我在SQL查询格式进行格式化,这是它能够执行:

select this.last_name 
from member this 
where this.END_DATE>=SYSDATE 
and 1 > 
    (select count(*) 
    from member inner 
    where inner.last_name = this.last_name); 

那么,什么是可能与此查询做给我结果,我想什么呢?

0

事实上,我的答案部分取得了成功......因为我只展示了我的大部分要求。它是这样的:

select member.last_name, member.first_name, 
from member 
where 
    member.end_date > SYSDATE 
and 
    member.last_name in 
    (select member.last_name 
    from member 
    where 
    member.end_date > SYSDATE 
    group by member.last_name 
    having count(member.last_name) >1) 
order by member.last_name; 

它显示数据库中具有同名(同名)的所有成员。因此,对于您的信息,这是我最后的标准:

Calendar now = Calendar.getInstance(); 
DetachedCriteria innerQuery = DetachedCriteria.forEntityName(Member.ENTITY_NAME,"inner") 
     .setProjection(Projections.rowCount()) 
     .add(Restrictions.eqProperty("lastName", "outer.lastName")) 
     .add(Restrictions.ge("endDate", now)); 

Criteria criteria = getSession(false).createCriteria(Member.ENTITY_NAME, "outer") 
     .setProjection(Projections.property("lastName"))     
     .add(Restrictions.ge("endDate", now)) 
     .add(Subqueries.lt(new Integer(1), innerQuery)); 

要稍微解释一下,与投影,我计算行数,我比较姓氏(选择的)同姓氏主要查询。 此外,主标准的第二行始终是必需的。如果您使用子查询(DetachedCriteria),则必须使用投影。 但是,最后,我用一个HQL查询运行我的代码,因为标准是更沉重的工作...

所以,感谢您的回答...