带投影的Hibernate条件不会返回实现条件的实体

时间:2011-09-29 06:26:36

标签: hibernate spring criteria

我正在使用spring-hibernate并使用HibernateDAOSupport类。 我有两个表以一对多的方式相互映射。 我正在实施以下标准

 DetachedCriteria criteria = getCriteria( "a" )
        .setProjection( Projections.projectionList()
                .add( Projections.groupProperty("a.id" ) )
                .add( Projections.count( "a.id" ), "count" )
                )
        .createCriteria( "huApps", "hu")
        .addOrder( Order.desc( "count" ) )
        ;

这很有效并创建以下查询

select
        this_.id as y0_,
        count(this_.id) as y1_ 
    from
        apps this_ 
    inner join
        huapps huapp1_ 
            on this_.id=huapp1_.appid 
    group by
        this_.id 
    order by
        y1_ desc

结果,它返回object[]的列表。但我希望它应该返回List<App>(App是我实现/创建标准的类)。 我希望它会创建查询

select
 this_
    from
        apps this_ 
    inner join
        huapps huapp1_ 
            on this_.id=huapp1_.appid 
    group by
        this_.id 
    order by
        y1_ desc

请帮我写出正确的标准。 我也试过sqlProjection(),但即使这样也行不通。 有什么方法可以实现这个目标吗?

2 个答案:

答案 0 :(得分:2)

尝试拨打

DetachedCriteria criteria = getCriteria( "a" )
    .setProjection( Projections.projectionList()
    .add( Projections.groupProperty("a.id" ), "id" )
            .add( Projections.count( "a.id" ), "count" )
            )
    .createCriteria( "huApps", "hu")
    .addOrder( Order.desc( "count" ) )
    .setResultTransformer(Transformers.aliasToBean(App.class))

这应该将属性别名映射到您指定的bean的字段。应用程序需要在适当的字段上设置setter和getter

答案 1 :(得分:1)

您尝试为函数detachedCriteria.createCriteria("huApps", "hu")的结果添加orger for new critheria。此函数返回huApp属性类的新条件。

尝试替换您的标准:

DetachedCriteria detachedCriteria = DetachedCriteria.forClass(A.class);
detachedCriteria.setProjection(Projections.projectionList()
            .add(Projections.groupProperty("id"))
            .add(Projections.count("id"), "count")
    );

detachedCriteria.createCriteria("huApps", "hu");
detachedCriteria.addOrder(Order.desc("count"));

List<A> list = detachedCriteria.getExecutableCriteria(getSession()).list();

它适用于我。