gpt4 book ai didi

hibernate 条件按子属性分组

转载 作者:行者123 更新时间:2023-12-03 08:08:13 24 4
gpt4 key购买 nike

假设如下:

public class Enterprise
{
private int id;
private String name;
}
public class Site
{
private int id;
private String name;
private Enterprise enterprise; //@ManyToOne relation
}
public class Area
{
private int id;
private String name;
private Site site; //@ManyToOne relation
}

我想通过企业使用 hibernate 标准分组结果执行查询。

    Criteria criteria = session.createCriteria(Area.class);
criteria.setProjection(Projections.projectionList()
.add(Property.forName("id").as("id"))
.add(Property.forName("name").as("name"))
.add(Projections.groupProperty("site.enterprise")))
.setResultTransformer(Transformers.aliasToBean(Area.class));
/*
* more conditions
*/
List<Area> areas = criteria.list();

执行此 hibernate 时返回异常:org.hibernate.QueryException:无法解析属性:site.enterprise ...

有什么优雅的方法可以做到这一点。提前谢谢你。

最佳答案

我相信你可能需要先设置别名:

criteria.createAlias("site", "s")

然后使用:

Projections.groupProperty("s.enterprise")

您可能还需要对字段而不是实体进行分组,因此:

site.enterprise.name // or id

这可能需要您也为 enterprise 创建一个别名,但您可能不需要。

更新 1:你可能会得到这样的结果:

Criteria criteria = session.createCriteria(Area.class);
criteria.createAlias("site", "s")
.createAlias("s.enterprise", "e")
.setProjection(Projections.projectionList()
.add(Property.forName("id").as("id"))
.add(Property.forName("name").as("name"))
.add(Projections.groupProperty("s.e.name")))
.setResultTransformer(Transformers.aliasToBean(Area.class));

更新 2: 叫我疯了,但从上面的例子来看,你可能采取了一种非常冗长的方法,没有充分利用 Hibernate - 看起来你正在尝试使用它就像 SQL 一样。 Hibernate 已经知道您的实体、它们的字段和关系。在我看来,这相当于上面的:

Criteria criteria = session.createCriteria(Area.class);
criteria.createAlias("site", "s")
.createAlias("s.enterprise", "e")
.add(Projections.groupProperty("s.e.name"));

// Any other conditions.

List<Area> areas = criteria.list();

我什至不确定你现在为什么要对它进行分组......

关于 hibernate 条件按子属性分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14193058/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com